C# 强制依赖项属性的需要是什么?

C# 强制依赖项属性的需要是什么?,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,我看到了一个示例,其中有两个依赖项属性: public static readonly DependencyProperty CurrentReadingProperty = DependencyProperty.Register("CurrentReading", typeof(double), typeof(Gauge), new FrameworkPropertyMetadata(Double.NaN, FrameworkProper

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

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)
);

在OnCurrentradingChanged中,我执行以下操作
d.胁迫值(MinReadingProperty)

调用具有以下代码的强制ValueCallback委托(“强制读取”):

private static object CoerceMinReading(DependencyObject d, object value)
{
    Gauge g = (Gauge)d;
    double min = (double)value;
    // some required conditions;
    return min;
}
我想了解的是,为什么我需要执行强制

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

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


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

您不应该这样做。也不清楚为什么你认为你确实需要这样做……在这种情况下,这是适当的——但在OnCurrentradingChanged中,这不值得强调。@Henkholtman,你能解释一下吗。从表面上看,该案例与示例和
private static object CoerceMinReading(DependencyObject d, object value)
{
    Gauge g = (Gauge)d;
    double min = (double)value;
    // some required conditions;
    return min;
}