8

CoerceValueCallback値を修正するために使用され、ValidateValueCallbacktrue または false を返すことを知っています。しかし、私の質問は、なぜ必要なのValidatevalueCallbackですか? 単純CoerceValueCallbackに (if 条件を使用して) 検証し、値を修正するために使用できます。強制と検証をいつ使用するかについて、実用的な例を挙げていただけますか?

4

2 に答える 2

16

強制と検証をいつ使用するかについて、私が従う規則は次のとおりです。

次の場合に使用CoerceValueCallback...

  • エラーをスローする必要なく、値が有効になるように安全に修正できます。
  • プロパティは、1 つ以上の他の依存関係プロパティに依存しています。
  • クラス レベルの検証ではなく、インスタンス レベルの検証を提供する必要があります。
  • 他のユーザーが検証ロジックをオーバーライドできるようにします。

次の場合に使用ValidateValueCallback...

  • 値を有効に修正することはできません。
  • 無効な値が指定された場合は、エラーをスローする必要があります。
  • 他の人が検証ロジックをオーバーライドしないようにします。

したがって、主に、プロパティが他の依存関係プロパティに依存しているかどうか、または他の人が検証ロジックをオーバーライドできるようにするかどうかによって異なります。

ValidateValueCallbackは の一部ではないため、PropertyMetadata継承者はDependencyProperty.OverrideMetadata関数を介してコールバックを変更できません。

また、はパラメーターとしてValidateValueCallbackyour を提供しないため、DependencyObject他の依存関係プロパティに依存する高度な検証を実行できません。

例 1

、、、およびプロパティがMinimumあるとします。これらのいずれかが変更された場合は、他のプロパティが一貫していることを確認するために使用する必要があります。つまり、<= <=です。MaximumValueCoerceValueCallback
MinmumValueMaximum

Double.NaNただし、これらの値が double であると仮定すると、 、Double.PositiveInfinity、および など、意味をなさない値がいくつかありますDouble.NegativeInfinity。したがって、aValidateValueCallbackを使用して、double 値が通常の数値であることを確認する必要があります。

実際、これはまさにそのRangeBase仕組みです!

例 2

RegexTextBox正規表現を含む文字列を取るコントロールがあるとします (それを と呼びます) RegexString。不適切な正規表現が提供された場合、代わりに何を使用する必要がありますか? null/空の値になるように強制して、役に立たなくすることは理にかなっているかもしれません。ただし、このプロパティは で検証することをお勧めしますValidateValueCallback。これは、WPF デザイナーを介して設計する場合、コンパイル時にエラーがスローされるようになったためです。

このプロパティには、 がまったくないはずCoerceValueCallbackです。


これらのコールバックの使用方法を説明する情報はたくさんあります。詳細については、MSDN の記事Dependency Property Callbacks and Validationを参照することをお勧めします。

于 2015-11-05T16:40:50.667 に答える
8

値の強制は基本的に、新しい値がシステムの期待どおりでない場合に値を変更することです。最良の例は、Slider コントロールです。Slider には、Minimum プロパティと Maximum プロパティの両方があります。明らかに、最大値が最小値を下回ることが許されると問題になります。この無効な状態が発生するのを防ぐために、値の強制が使用されます。

Validate value は、システムが指定された入力が有効かどうかのみをチェックするものです。値が無効な場合 (そのような値に対して false を返した場合)、Argument Exception がスローされます。たとえば、Age プロパティがあり、それは 0 から 120 の範囲である必要があります。新しい値が 500 の場合、システムはハードコードされた値に強制する代わりに、ユーザーに警告する場合があります。

いずれにせよ、両方のコールバックはオプションであり、要件に基づいて使用できます。

于 2013-06-26T04:24:25.800 に答える