1

私はMVVMを使用しており、IDataErrorInfoを使用してほとんどの検証を行っており、ViewModelには検証が必要な各メンバーの有効性をチェックするIsValidプロパティがあります。ただし、nullにできないintにバインドされたテキストボックスがいくつかあるため、ValidationRuleを使用して、そのフィールドを空白にした場合にユーザーに警告します(「値を変換できませんでした」よりもわかりやすいメッセージで)明らかにプロパティ セッターが呼び出されないため、IDataErrorInfo コードは呼び出されません。

問題は、検証エラーが発生した場合に無効にしたい [保存] ボタン (RelayCommand) があることです。したがって、そのコマンドの CanExecute は VM の IsValid プロパティをチェックします。しかし、明らかに、ユーザーが int フィールドを空白にすると、IDataErrorInfo はそれについて何も認識せず、現在ボタンは無効になりません。ViewModel がそのエラーを検出できる方法はありますか?

ここで解決策を見つけたと思いました http://wpfglue.wordpress.com/2009/12/03/forwarding-the-result-of-wpf-validation-in-mvvm/ しかし、それをC#に翻訳したので、できます動作するようにします (強制コールバックは呼び出されません)。私は依存関係のプロパティとオブジェクトをまだよく理解していません (WPF の非常に新しい)、このソリューションは複雑に見えます。

私が考えられる唯一のことは、検証ルールを取り除き、null 許容の int ラッパーを作成し、バインディングに TargetNullValue='' を配置してから、IDataErrorInfo コードで null をチェックすることです。もっと良い方法があれば、これをしないことをお勧めします。

4

3 に答える 3

1

私はすぐに2つの強力なオプションを考えることができます。1つは、ViewModelの文字列プロパティにバインドすることです。このプロパティは、文字列が有効であると判断された場合にのみ、基になる「int」値を解析して格納するようにプログラムされています。これにより、TextBoxが常にデータバインドされた値を正常に保存できるようになります。

2つ目は、ビューで発生するValidationExceptionsをインターセプトし、カスタム動作を介してViewModelに保存することです。 この記事は、基本的に、質問で説明したとおりに機能します。

于 2012-05-23T02:21:33.207 に答える
1

ビューモデルの IDataErrorInfo 検証で int の代わりに文字列プロパティを使用しないのはなぜですか? もちろん、 IDataErrorInfo にエラーがない場合は、 savecommand で文字列を int 値に安全に変換できます。IDataErrorInfo で文字列プロパティを使用するのが最も簡単な方法です。

編集:もう一度考えてみてください。文字列プロパティを使用しない場合、別の問題があります。int プロパティがあり、ユーザーがテキスト ボックスに 10 を設定したとします。したがって、ビューモデルには10があります。ユーザーは10を削除し、テキストボックスにabcを設定します。bindingconversationexception のため、ビューモデルはまだ 10. です。そのため、ほとんど文字列プロパティを使用しています。公平を期すために、テキストボックスの動作を使用してマスクを設定できるため、ユーザーは無効なデータを入力できません。

于 2012-05-22T14:07:57.530 に答える
0

試すことができるのはBindingGroups、単一のプロパティだけでなく、要素全体を検証することです。これをモーダル ダイアログに使用して、たとえば、ダイアログを終了する前に特定の設定を行う必要があるプロジェクトを作成しました。このリンクはそれを詳細に説明しました。これもかなり詳しいです。

于 2012-05-22T10:29:47.250 に答える