强制依赖属性需要什么?

时间:2015-05-21 16:43:31

标签: c# wpf dependency-properties

我看到了一个有2个依赖属性的例子:

public static readonly DependencyProperty CurrentReadingProperty = 
    DependencyProperty.Register("CurrentReading", 
    typeof(double), 
    typeof(Gauge), 
    new FrameworkPropertyMetadata(Double.NaN,
        FrameworkPropertyMetadataOptions.None,
        new PropertyChangedCallback(OnCurrentReadingChanged),
        new CoerceValueCallback(CoerceCurrentReading)
    ),
    new ValidateValueCallback(IsValidReading)
);

public static readonly DependencyProperty MinReadingProperty =
    DependencyProperty.Register(
    "MinReading",
    typeof(double),
    typeof(Gauge),
    new FrameworkPropertyMetadata(
        double.NaN,
        FrameworkPropertyMetadataOptions.None,
        new PropertyChangedCallback(OnMinReadingChanged),
        new CoerceValueCallback(CoerceMinReading)
    ),
    new ValidateValueCallback(IsValidReading));

并在OnCurrentReadingChanged中执行以下操作 d.CoerceValue(MinReadingProperty);

调用具有以下代码的CoerceValueCallback委托(“CoerceMinReading”):

private static object CoerceMinReading(DependencyObject d, object value)
{
    Gauge g = (Gauge)d;
    double min = (double)value;
    // some required conditions;
    return min;
}

我想要了解的是,为什么我需要执行强制?

为什么我不能在我的属性中调用SetValue更改回调并更改所需的属性而不是调用CoerceValue并在我的强制回调中处理事情?

1 个答案:

答案 0 :(得分:10)

强制旨在(可选)确保值在UI层可以做出此类决策的情况下有效。一个典型的例子是某种滑块控件,其中绑定属性试图将值设置在滑块的指定范围之外。在这种情况下,可以接受“钳制”。它的最小值或最大值,而不是抛出验证例外。

在SetValue属性更改期间调用SetValue效率不高,因为您可能会使用递归事件充斥系统。这就是强制存在的原因。请记住它的限制并在适当的地方使用它。在这种情况下,这是合适的。