MVVMのテキストボックスに簡単な検証を実装しようとしています
public string Property
{
get
{
if (App.PropertyStorageContainer != null)
{
return App.PropertyStorageContainer.Property;
}
else
{
return null;
}
}
set
{
App.PropertyStorageContainer.Property = value;
RaisePropertyChanged("Property");
}
}
次に、PropertyStorageContainerクラスに
private string _property;
public string Property
{
get
{
return App.PropertyStorageContainer.Property;
}
set
{
if(value meets some condition)
{
_property = value;
}
else
{
_property = someothervalue;
}
}
}
。
<TextBox Width="50" TextAlignment="Center" Text="{Binding Property, Mode=TwoWay, NotifyOnValidationError=True}" MaxLength="3"></TextBox>
これのポイントは、ボックスに何が入っているかを検証することです。この値をコードから直接設定すると、すべてが期待どおりに機能します。値を設定しようとし、次にRaiseProperyChangedを呼び出し、次に値をGETします(検証のため、最初に入力された値とは異なる場合があります)。取得された最終値はビューに表示されるので、TwoWayバインディングが機能していることがわかります。
私が抱えている問題は、SETの入力がバインドされたXAMLプロパティから/ユーザーから直接取得された場合です。この場合、SETメソッドが呼び出され、検証が実行されますが、GETは発生しません。これにより、未検証の値が画面のテキストボックスに残ります。
私の最初の質問は、これはバグですか、それとも予想される動作ですか?GETに新しいものは何もないはずなので、ユーザーから直接入力があったときに最後のGETを削除することで、パフォーマンスを節約しようとした可能性があります。しかし、そうでない場合は、おそらく私がすべてのセットアップを行っている方法が、呼び出されているGETに干渉しています。
2番目の質問はもちろんこれを回避するための提案です。検証を行う他の方法についていくつかの提案を読みましたが、私のプログラムはすでにPRODで公開されており、提案されている変更のほとんどは私にとって多くの手直しを伴うため、GETanyを呼び出す方法を見つけたいと思っています。プロパティがSETである時間。