2017-04-18 11 views
0

WPFでは、一般的な検証実装では、プロパティ値が変更されたときに検証が行われます。これは問題を提起する。 「必須」フィールドがあり、ボタンをクリックすると、ボタンをクリックしたときに空白がユーザーに通知されません。値は変わらないので、検証は行われません。どこで呼び出すかエンタープライズライブラリの検証ブロックの空フィールドの検証時にRequired.GetBindingExpression

このオンラインでは、コードビハインド、ベースビューモデルなどで明示的に検証を実行する方法はたくさんありますが、マイクロソフトが提案するソリューションに興味があります。特にこれは、現在使用しているMicrosoftエンタープライズライブラリの検証アプリケーションブロックに適用されます。マイクロソフトは、ここでのベストプラクティスのアプローチを推奨しています: 彼らは述べる。特にhttps://msdn.microsoft.com/en-us/library/ff664451(v=pandp.50).aspx

必要な検証属性を運ぶ検証コントロールの値がそもそも空で、検証中に空のままの場合は、ソースは更新されず、検証は行われません。この特定のケースでは、ターゲットのnullデフォルト値が変更されないため、ValidateOnTargetUpdateプロパティーは機能しません。

this.Required.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

値が変換された後、それが設定される前に、検証ルールは、ConvertedProposedValueのステップで動作します。その代わり、あなたはここに示すように、発生する検証を強制的に結合にUpdateSourceを呼び出すことができますソース上で。これは、値変換エラーが他のメカニズムによって検出されなければならないことを意味します。 1つの方法は、検証されたバインディングでValidatesOnDataErrorsプロパティを有効にすることです。

残念ながら私はこれを理解できません。どこでUpdateSourceメソッドを呼び出すのですか?どのオブジェクトがthisでMicrosoftのスニペットを参照していますか?私はどこかのバインディングを傍受するような何かをする必要があると仮定していますが、わかりません。

+0

あなたの 'Window'クラスはその機能を必要とせず、' MainWindow.xaml.cs'にそれを入力すると 'GetBindingExpression'関数が得られます。これは任意の 'コントロール'で利用可能です。 – XAMlMAX

答えて

0

私はこれを理解しました。コメントセクションで述べたように、ウィンドウやコントロール内のGetBindingExpressionにアクセスできます。私は、Microsoftの意図はRequiredがコントロールのサンプル名であり、thisがWindowのコードビハインド、またはコードビハインドを持つWindowのような他のコントロールを指していると考えています。

他のバリデーション構成(たとえば、開発者がIDataErrorInfoを実装した場合など)の別の場所で提案されているようにPropertyChangedイベントを呼び出すと、Microsoftエンタープライズライブラリの検証ブロックで同じ効果がないようです。単純にコントロールのPropertyChangedイベントを発生させるだけで、検証は再開されません。これは必須フィールドに固有のものではありません。代わりに、マイクロソフトでは、必要なフィールドを参照しながら、コントロール上でUpdateSourceを実行することを提案しています。

ここでHow to invoke UpdateSource for all bindings on the form?はすべての要素でUpdateSourceを達成する方法の例です。

関連する問題