2017-03-24 14 views
2

私は、INotifyDataErrorInfoを持つMVVMアプリケーションをすべてセットアップして機能させています。現在、私は自分のすべてのプロパティを検証し、すべてのエラーが処理されるまでユーザーの進行を阻止することができます。最近まで、すべてのコントロール(数字とユニットタイプ(100mm)を表示するためのテキストボックスとラベルを組み合わせたもの)が、値が削除/バックスペースされたときに赤いエラーデコレータを表示していないことがわかったときに、WPFコンバータのエラー処理とモデルの検証

コントロールには、ダブルクリックしてテキストボックスに表示する文字列に変換するコンバータがあります。変換バックが文字列をdoubleに変換できなかった場合、Binding.DoNothingを送信していたconvertbackメソッドに問題が見つかりました。これをDependencyProperty.UnsetValueに変更し、すべてがうまくいくと思ったが、それはより大きな問題を明らかにした。

私たちが今問題を抱えているのは、コンバータが失敗していることがビューモデルに通知されていないということです。ユーザーがテキストボックスの内容を削除すると、コンバータは空の文字列で呼び出されます。その空の文字列は二重に解析されません。

VMに変換エラーが発生したことを通知する方法が必要なので、hasErrorとしてプロパティにフラグを立てることができます。私はこれを行う方法はありません。ここにconvertbackメソッドのコードを示します。

 public object[] ConvertBack(object value, Type[] targetTypes, object   parameter, CultureInfo culture) 
    { 
     var strVal = value as string; 
     double dblVal = 0; 
     bool isSuccess = double.TryParse(strVal, out dblVal); 

     if (_systemUnits == SystemUnits.Metric && isSuccess) 
     { 
      return new[] { dblVal, Binding.DoNothing }; 
     } 
     else if (_systemUnits != SystemUnits.Metric && isSuccess) 
     { 
      return new[] { Binding.DoNothing, dblVal }; 
     } 
     else 
     { 
      return new[] { Binding.DoNothing, Binding.DoNothing }; 
     } 
    } 
} 

私は他のコードが関係しているかどうかはわかりませんが、それが役立つと思ったらもっと投稿して欲しいです。御時間ありがとうございます!

+0

私は値ビーイングの実際の型にプロパティを変換することをお勧めしたいです(テキストである - はい、それはユニット指定と組み合わせて数字ですが、一緒にテキストにすぎません)、VM内の内容を検証します。安くて速い。他のオプションには、数値とユニットを組み合わせた特殊な構造体を作成し、静的な "無効な"値(double.NaNなど)を定義し、ユーザーの入力が無効な場合にこの値を返します。もっと複雑ですが、それほど揺れはありません。 – Will

+1

@ウィルこれは私が恐れていたものでした。ほとんどすべての実行可能なソリューションは、プロパティを文字列に変更することを中心に展開しています。私にとっては非常に不便ですが、それ以上のオプションはないように見え始めています。 – Terrordoll

答えて

0

私は疑問にし、静的およびコールそのコンバータのアクセスにVMの最新のインスタンスを持っているアプリクラスのオフに提供する静的をVM

に通知する方法が必要ですように私は感じますステータスを通知するためのメソッド/プロパティ。

- または -

私はあなたが言及障害の推定値を提供するためのコンバータと同じ作業を行う計算プロパティを作成することをお勧めします。

次に、計算されたプロパティにアクセスし、必要な処理を行うだけです。ここで


はそのINotifyPropertyChangeなどを経由して、必要に応じて結合しており、ステータスをチェックすることができ、例えばプロパティIsOverLimitです...

public bool IsOverLimit { get { return ThreadCreationLimit > 120 } } 

public uint ThreadCreationLimit 
    { 
     get { return _ThreadCreationLimit; } 
     set 
     { 
      _ThreadCreationLimit = value; 
      OnPropertyChanged("ThreadCreationLimit"); 
      OnPropertyChanged("IsOverLimit"); 
     } 
    } 
関連する問題