たとえば、Canvas の ScaleTransform を変更する依存関係プロパティがありますが、0 を下回るとエラーがスローされます。確かに、それが発生した場合は、コードで強制的にゼロにすることもできますが、Silverlight には存在しない、または最小/最大値を設定することさえない udouble (符号なし double) を使用するような、より良い方法を使用したいと思います。 DependencyProperty のどこかに。
ここで最善のアプローチは何ですか?
たとえば、Canvas の ScaleTransform を変更する依存関係プロパティがありますが、0 を下回るとエラーがスローされます。確かに、それが発生した場合は、コードで強制的にゼロにすることもできますが、Silverlight には存在しない、または最小/最大値を設定することさえない udouble (符号なし double) を使用するような、より良い方法を使用したいと思います。 DependencyProperty のどこかに。
ここで最善のアプローチは何ですか?
これを DependencyProperty で処理する場合は、PropertyChangedCallbackで処理することをお勧めします。これにより、値が正しい範囲内にあることが検証され、そうでない場合はオーバーライドされます。
依存関係プロパティの外部でこれを処理することもできます。例えば:
それに加えて、PropertyChangedCallback 内では、典型的なパターンは、例外をスローする前に、正しくない/範囲外の値を元に戻すことです。
元に戻さないと、実際には範囲外の値が設定されたままになり、状態が無効になります。
Silverlight Toolkit のいくつかで、この「貧乏人の強要」の例を見ることができます。AutoCompleteBox.cs ソースは次のとおりです。
パターンは次のようなものです。
int newValue = (int)e.NewValue;
if (newValue < 0)
{
source._ignorePropertyChange = true;
d.SetValue(e.Property, e.OldValue);
throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, Properties.Resources.AutoComplete_OnMinimumPopulateDelayPropertyChanged_InvalidValue, newValue), "value");
}
独自の「読み取り専用」Silverlight 依存関係プロパティを同様の方法で実装することもできますが、値を設定するか元に戻すかを示すプライベート フィールドが必要になります。