CoerceValueCallback
値を修正するために使用され、ValidateValueCallback
true または false を返すことを知っています。しかし、私の質問は、なぜ必要なのValidatevalueCallback
ですか? 単純CoerceValueCallback
に (if 条件を使用して) 検証し、値を修正するために使用できます。強制と検証をいつ使用するかについて、実用的な例を挙げていただけますか?
2 に答える
強制と検証をいつ使用するかについて、私が従う規則は次のとおりです。
次の場合に使用CoerceValueCallback
...
- エラーをスローする必要なく、値が有効になるように安全に修正できます。
- プロパティは、1 つ以上の他の依存関係プロパティに依存しています。
- クラス レベルの検証ではなく、インスタンス レベルの検証を提供する必要があります。
- 他のユーザーが検証ロジックをオーバーライドできるようにします。
次の場合に使用ValidateValueCallback
...
- 値を有効に修正することはできません。
- 無効な値が指定された場合は、エラーをスローする必要があります。
- 他の人が検証ロジックをオーバーライドしないようにします。
したがって、主に、プロパティが他の依存関係プロパティに依存しているかどうか、または他の人が検証ロジックをオーバーライドできるようにするかどうかによって異なります。
ValidateValueCallback
は の一部ではないため、PropertyMetadata
継承者はDependencyProperty.OverrideMetadata
関数を介してコールバックを変更できません。
また、はパラメーターとしてValidateValueCallback
your を提供しないため、DependencyObject
他の依存関係プロパティに依存する高度な検証を実行できません。
例 1
、、、およびプロパティがMinimum
あるとします。これらのいずれかが変更された場合は、他のプロパティが一貫していることを確認するために使用する必要があります。つまり、<= <=です。Maximum
Value
CoerceValueCallback
Minmum
Value
Maximum
Double.NaN
ただし、これらの値が double であると仮定すると、 、Double.PositiveInfinity
、および など、意味をなさない値がいくつかありますDouble.NegativeInfinity
。したがって、aValidateValueCallback
を使用して、double 値が通常の数値であることを確認する必要があります。
実際、これはまさにそのRangeBase
仕組みです!
例 2
RegexTextBox
正規表現を含む文字列を取るコントロールがあるとします (それを と呼びます) RegexString
。不適切な正規表現が提供された場合、代わりに何を使用する必要がありますか? null/空の値になるように強制して、役に立たなくすることは理にかなっているかもしれません。ただし、このプロパティは で検証することをお勧めしますValidateValueCallback
。これは、WPF デザイナーを介して設計する場合、コンパイル時にエラーがスローされるようになったためです。
このプロパティには、 がまったくないはずCoerceValueCallback
です。
これらのコールバックの使用方法を説明する情報はたくさんあります。詳細については、MSDN の記事Dependency Property Callbacks and Validationを参照することをお勧めします。
値の強制は基本的に、新しい値がシステムの期待どおりでない場合に値を変更することです。最良の例は、Slider コントロールです。Slider には、Minimum プロパティと Maximum プロパティの両方があります。明らかに、最大値が最小値を下回ることが許されると問題になります。この無効な状態が発生するのを防ぐために、値の強制が使用されます。
Validate value は、システムが指定された入力が有効かどうかのみをチェックするものです。値が無効な場合 (そのような値に対して false を返した場合)、Argument Exception がスローされます。たとえば、Age プロパティがあり、それは 0 から 120 の範囲である必要があります。新しい値が 500 の場合、システムはハードコードされた値に強制する代わりに、ユーザーに警告する場合があります。
いずれにせよ、両方のコールバックはオプションであり、要件に基づいて使用できます。