2011-07-12 13 views
5

今日私は、WPF TextBox入力での検証のためのMSDNの例を調べました(http://msdn.microsoft.com/en-us/library/ms753962.aspxも参照してください)。WPF TextBoxが無効になってもViewModelが更新されないのはなぜですか?

私自身のアプリケーションでは、ビューのDataContextをMVVMパターンを使用してViewModelにバインドします。特定のテキストボックスは、ViewModelのプロパティへのデータバインディングであり、特定のValidationRulesを持っています。

私が発見したのは、値が無効になったときに、前に正常に検証された後、古い値がViewModelに残ります。私の意見では、値がコマンドの実行に使用されているなど、非常に不慣れです。

この正確な問題は、指定したMSDNの例にも当てはまります。 TextBoxの値は、正常に検証された後にのみソースに戻されます。私は、検証ロジックを維持したいと思いますが、常にソースを更新する必要があります。これは可能ですか?

ありがとうございます。

+0

BindingModeをTwoWayに設定するには、明示的に試してください。http://msdn.microsoft.com/it-it/library/system.windows.data.bindingmode.aspx – Tigran

+1

あなたが望むのは、メカニズムの設計/目的。 So:本当に可能です。 –

+0

@Tigran、応答してくれてありがとうが、残念ながらそれは違いはありません。 –

答えて

3

レイチェルとヘンクが指摘したように、これがWPF検証規則の構築方法です。検証に失敗した場合、プロパティに値を書き込むことはありません。

なぜ彼らはそれをそのように構築することにしたのかというと、検証が失敗したときに一貫した動作を望むからでしょう。ビューの値が無効な場合があります(たとえば、負の年齢)が、プロパティに書き込むことができます。それ以外のときは、プロパティに書き込むことができないような方法で無効です(例えば、 "foo"のAgeはintに変換できません)。その動作が「可能であればプロパティに値を書き込む」場合は、混乱する可能性があります。

私のViewModelが検証エラーにかかわらず可能な限り更新されていれば、あなたのように私は好きです。 Business objects are a different matterしかし、 "Fort Knox ViewModels"は私には奇妙なようです。無効な入力はOKではないから、と予想されます。通常、私のViewModelでは、「最後の有効な値」ではなく、「現在の値」を知りたいと思います。これは私がValidationRulesを好まない理由の1つです。

+0

優秀な点:「Fort Knox ViewModelsは無効な入力はOKではないので私にとっては奇妙に思えます。 – Jay

+0

ああ、少なくとも私と同意する人!検証システムのために何らかの手動オーバーライドがあると便利です!私はあなたのブログを見て、音は発明的であると考えます。その間、ValidationRulesを削除します! –

2

入力されたデータが指定されたプロパティに対して有効であることを確認する必要があります。データが無効な場合は、プロパティに格納しないでください。

たとえば、IntegerフィールドにバインドされたTextBoxに文字を入力した場合、例外がスローされるため、アプリケーションは文字をintに入れてはいけません。

別の方法として、データの一部の手動検証チェックを行い、データが有効である場合はtrue/falseを返す方法があります。

関連する問題