强制依赖属性有什么必要?

12

我看到一个例子,其中有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 并在我的 coercing 回调中处理事情呢?


2
你永远不应该这样做。而且也不清楚为什么你觉得需要这样做... - user1228
1个回答

14

强制转换旨在在UI层可以做出这种决策的情况下(可选地)确保值是有效的。一个经典的例子是某种滑块控件,其中绑定属性试图将值设置到指定范围之外。在这种情况下,与其抛出验证异常,将值“夹住”到其最小值或最大值是可以接受的。

在SetValue属性更改期间调用SetValue不高效,因为您有可能会向系统发送递归事件。这就是为什么强制转换存在的原因。只要记住它的限制并在适当的情况下使用它即可。在这种情况下,使用它是合适的。


在这种情况下,这是合适的 - 但不适用于OnCurrentReadingChanged事件,这需要一些强调。 - H H
@HenkHolterman,您能解释一下吗?乍一看,这个案例与这里这里的示例相匹配。 - Phil Jollans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接