【问题标题】:What is the need for Coercing a Dependency Property?强制依赖属性需要什么?
【发布时间】:2015-05-21 16:43:31
【问题描述】:

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

【问题讨论】:

  • 您永远不必这样做。也不清楚为什么你认为你确实需要这样做......

标签: c# wpf dependency-properties


【解决方案1】:

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

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

【讨论】:

  • 在这种情况下是合适的 - 但不是在 OnCurrentReadingChanged 中,这值得强调。
  • @HenkHolterman 你能解释一下吗?从表面上看,这种情况与here 和here 的例子相匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 2010-10-11
  • 2016-05-18
  • 2011-03-01
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
相关资源
最近更新 更多