2017-03-02 13 views
0

MVVMアーキテクチャを使用したWPFアプリケーションがあります。ビューモデルは、ネストされたビューモデルからエラーを追加する実装でIDataErrorInfoを実装します。 SaveCommandは一番上のviewmodelのErrorをチェックし、何かがすべてのエラーのリストに遭遇していない場合、エラーMesssageBoxを表示します。モデルとコントロールのWPF MVVM検証

ビジネスロジックでチェックされたエラー(必須フィールドなど)では問題ありませんが、たとえば次のような変換エラーは処理されません。ユーザーは数値プロパティにバインドされたTextBoxに名前を入力します。

ViewModelのエラーとUIに表示されているものの、実際にviewmodelに到達していないエラーを組み合わせた良い方法やライブラリがありますか? viewmodelのすべての文字列プロパティに戻り、変換が正しく行われるようになります。私は論理的なコントロールツリーを通って変換エラーによって引き起こされたすべてのエラーのリストを取得し、このリストをINotifyDataInfo errorMessageと組み合わせることを考えましたが、おそらくもっと良い方法がありますか?

+0

このような問題は、適切なコントロールを使用することで解決できます。ユーザーが1から100の間の値を入力することになっている場合は、スライダがそのために設計されているときにテキストボックスを使用する理由、ビューを検証すると、ビューによって渡されたデータのみが検証されます。 MVVM – MikeT

+0

*ユーザーは、UIにエラーを自動的に表示する数字プロパティ* watにバインドされたTextBoxに名前を入力します – Will

+0

コントロールにエラーが表示されますが、ビューモデルには何も分かりませんエラーはバインディングの値変換から来ているので、それについてです。そのため、Saveが呼び出されたときにIDataErrorInfo自体が有効になるビューモデルは、一部のコントロールでバインディングエラーが表示されている間は変更されていない値で保存を実行します。 –

答えて

0

カスタムValidationRuleを使用して、これをBindingオブジェクトに関連付けて、動作またはこの検証をカスタマイズすることができます。詳細については、次のブログの記事を参照してください:https://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/

<TextBox> 
    <TextBox.Text> 
     <Binding Path="Age" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <local:StringToIntValidationRule ValidationStep="RawProposedValue"/> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
    ... 
</TextBox> 


public class StringToIntValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     int i; 
     if (int.TryParse(value.ToString(), out i)) 
      return new ValidationResult(true, null); 

     return new ValidationResult(false, "Please enter a valid integer value."); 
    } 
} 

また、この種の検証はビューまたはコントロールで行われます。ビューがビューモデルが公開するパブリックプロパティの値を設定できることを確認することは、ビューモデルの責任ではありません。

プロパティを公開するだけで、設定するのはビューの責任であり、もちろん正しいタイプの値に設定する必要があります。

関連する問題