私は、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 };
}
}
}
私は他のコードが関係しているかどうかはわかりませんが、それが役立つと思ったらもっと投稿して欲しいです。御時間ありがとうございます!
私は値ビーイングの実際の型にプロパティを変換することをお勧めしたいです(テキストである - はい、それはユニット指定と組み合わせて数字ですが、一緒にテキストにすぎません)、VM内の内容を検証します。安くて速い。他のオプションには、数値とユニットを組み合わせた特殊な構造体を作成し、静的な "無効な"値(double.NaNなど)を定義し、ユーザーの入力が無効な場合にこの値を返します。もっと複雑ですが、それほど揺れはありません。 – Will
@ウィルこれは私が恐れていたものでした。ほとんどすべての実行可能なソリューションは、プロパティを文字列に変更することを中心に展開しています。私にとっては非常に不便ですが、それ以上のオプションはないように見え始めています。 – Terrordoll