1

たとえば、Canvas の ScaleTransform を変更する依存関係プロパティがありますが、0 を下回るとエラーがスローされます。確かに、それが発生した場合は、コードで強制的にゼロにすることもできますが、Silverlight には存在しない、または最小/最大値を設定することさえない udouble (符号なし double) を使用するような、より良い方法を使用したいと思います。 DependencyProperty のどこかに。

ここで最善のアプローチは何ですか?

4

2 に答える 2

3

これを DependencyProperty で処理する場合は、PropertyChangedCallbackで処理することをお勧めします。これにより、値が正しい範囲内にあることが検証され、そうでない場合はオーバーライドされます。

依存関係プロパティの外部でこれを処理することもできます。例えば:

  • コンバーター
  • モデルでこれを強制し、常に有効な値を持つ ViewModel にバインドします。MVVM の詳細については、こちらを参照してください。
于 2009-07-29T21:10:33.333 に答える
1

それに加えて、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 依存関係プロパティを同様の方法で実装することもできますが、値を設定するか元に戻すかを示すプライベート フィールドが必要になります。

于 2009-08-02T17:52:33.447 に答える