Silverlight には、DependencyObject.CoerceValue はありません。Silverlight でも次の WPF コードを実行するための代替手段を探しています。
状況: いくつかの DependencyProperties (MinimumProperty、MaximumProperty、LowerValueProperty、および UpperValueProperty) を持つクラス Range があります。
最小値が最大値よりも大きくなることはなく、最大値が最小値よりも小さくなることはありません。さらに、LowerValue と UpperValue は Minimum と Maximum の間にある必要がありますが、LowerValue は常に UpperValue より小さくなります。
すべての DependencyProperties は (WPF で) 次のように実装されます。
public static new readonly DependencyProperty MinimumProperty =
DependencyProperty.Register("Minimum",
typeof(double),
typeof(Range),
new FrameworkPropertyMetadata(0d,
new PropertyChangedCallback(Range.OnMinimumChanged),
new CoerceValueCallback(Range.CoerceMinimum)),
new ValidateValueCallback(Range.ValidateMinimum));
public new double Minimum
{
get { return (double)base.GetValue(MinimumProperty); }
set { base.SetValue(MinimumProperty, value); }
}
WPF での強制は次のように行われます。
private static object CoerceMinimum(DependencyObject source, object value)
{
Range r = source as Range;
double maximum = r.Maximum;
double val = (double)value;
if (val > maximum)
{
return maximum;
}
return value;
}
PropertyChangedCallback は次のようになります。
private static void OnMinimumChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
Range r = source as Range;
r.CoerceValue(LowerValueProperty);
r.CoerceValue(UpperValueProperty);
r.CoerceValue(MaximumProperty);
}
この場合、ValidateValueCallback は重要ではありません。他のコールバックは、示されているコードに似ています。
WPFでは、これはうまくいきます。たとえば、私は(XAMLで)設定しました
<Range LowerValue="12" Minimum="10" UpperValue="15" Maximum="20" />
すべての値が正しいです。順番は関係ありません!
しかし、Silverlight では実行できません。
最初のステップは、CoerceValueCallback の回避策です。次のように、PropertyChangedCallback で強制を発生させます。
private static void OnMinimumChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
Range r = source as Range;
double newVal = (double)e.NewValue;
double coercedVal = (double)CoerceMinimum(source, newVal);
if (coercedVal != newVal)
{
r.Minimum = coercecVal;
return;
}
r.CoerceValue(LowerValueProperty);
r.CoerceValue(UpperValueProperty);
r.CoerceValue(MaximumProperty);
}
ここで Minimum が値に設定されている場合、CoerceMinimum は引き続き実行され、Minimum-Coercion は適切に実行されます。
ただし、DependencyObject には CoerceValue-Method がないため、最後の 3 行はコンパイルされません。そして、まさにこれが私が途方に暮れている立場です。
MinimumChanged で LowerValue、UpperValue、Maximum の Coercion を上げるにはどうすればよいですか? または、初期化の順序が重要ではなく、すべてのプロパティが正しく設定されていることを確認する別の方法はありますか (条件が満たされていると仮定します)。
前もって感謝します!