强制依赖属性需要什么?

我看到了一个有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并在我的强制回调中处理事情?

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

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