强制依赖属性的必要性是什么?

本文关键字:必要性 是什么 属性 依赖 | 更新日期: 2023-09-27 17:50:15

我看到了一个例子,其中有两个依赖属性:

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和处理的东西在我的强制回调?

强制依赖属性的必要性是什么?

强制转换的目的是(可选地)确保一个值在UI层可以做出这样的决定的情况下是有效的。一个典型的例子是某种滑块控件,其中一个绑定属性试图将值设置在滑块的指定范围之外。在这种情况下,可以将值"夹紧"为最小值或最大值,而不是抛出验证异常。

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