使用CoercedValue绑定到依赖项属性具有令人困惑的行为

时间:2018-05-03 15:50:27

标签: c# wpf mvvm binding dependency-properties

情景:

  • 自定义或用户控件上存在DependencyProperty。
  • ViewModel在此DP上具有双向绑定
  • DP有限制。例如,假设DP是由Minimum和Maximum限定的数值。价值不能偏离这些界限。它使用CoerceValueCallback绑定旧值并将其返回到最小值和最大值。

将值更改为超出这些范围的值。列出的那些约束的操作顺序是:

  1. 绑定到ViewModel属性。
  2. 强制价值
  3. 因此,ViewModel属性获取uncoerced值,UI将显示强制值。

    为什么会这样? CoerceValueCallback的目的是什么?

    我现在唯一可以解决的问题是实现所有边界检查我的viewmodel,但是如果可能的话我想避免这样做。

    以下是一些显示一般情况的代码:

    MyControl.xaml.cs
    
    ...
    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
        nameof(Value),
        typeof(double),
        typeof(MyControl),
        new PropertyMetaData(0.0, ValuePropertyChanged, ValueCoerce));
    
    private static object ValueCoerce(DependencyObject d, object baseValue)
    {
        // Do Coercion
        return coercedValue;  // This happens AFTER the BoundValue was already updated.
    }
    ...
    
    
    ViewModel.cs
    ...
    public double BoundValue 
    {
        get => _boundValue;
        set 
        {
            _boundValue = value;  // This gets the uncoerced value.
            OnPropertyChanged(nameof(BoundValue))
        }
    }
    ...
    
    View.xaml
    
    ...
    <local:MyControl Value="{Binding BoundValue, Mode=TwoWay}"/>
    ...
    

0 个答案:

没有答案