Roh*_*jar 9 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)
);
Run Code Online (Sandbox Code Playgroud)
和
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));
Run Code Online (Sandbox Code Playgroud)
并在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;
}
Run Code Online (Sandbox Code Playgroud)
我想要理解的是,为什么我需要进行强制?
为什么我不能在我的属性中调用SetValue更改回调并更改所需的属性而不是调用CoerceValue并在我的强制回调中处理事情?
Jam*_*cas 10
强制被设计为(可选地)确保在UI层可以做出这样的决定的情况下值是有效的.一个典型的例子是某种滑块控件,其中绑定属性试图将值设置在滑块的指定范围之外.在这种情况下,可以将值"钳制"到它的最小值或最大值,而不是抛出验证异常.
在SetValue属性更改期间调用SetValue效率不高,因为您可能会使用递归事件充斥系统.这就是强制存在的原因.请记住它的限制并在适当的地方使用它.在这种情况下,这是合适的.