当新值相同时,DependencyProperty不会触发ValueChanged

Roe*_*elF 15 wpf dependency-properties callback inotifypropertychanged

好的,这就是问题所在:我写了一个UserControl,它接收一个新的值,比如每100毫秒,并用它做一些事情.它必须处理每个新的值设置器,即使值没有改变.UserControl有几个DependencyProperties:

public double CurrentValue
    {
        get { return (double)GetValue(CurrentValueProperty); }
        set { SetValue(CurrentValueProperty, value); }
    }

    public static readonly DependencyProperty CurrentValueProperty =
       DependencyProperty.Register("CurrentValue", typeof(double), typeof(GraphControl), new UIPropertyMetadata(0d));
Run Code Online (Sandbox Code Playgroud)

在使用此控件的XAML中,我只是将BindingCurrentValue设置为(启用INotifyPropertyChanged)属性:

<uc:UserControl CurrentValue="{Binding MyValue}" ... />
Run Code Online (Sandbox Code Playgroud)

视图模型:

    public double MyValue
    {
        get { return _value; }
        set
        {
            //if (_value == value) return;
            _value= value;
            if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("MyValue"));
        }
    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我明确地注释掉了if equals then return它,因此即使值更新为相同的值,它也会触发PropertyChanged事件.

现在回到我的用户控件,我尝试以两种方式注册ValueChanged; 首先使用DependencyPropertyDescriptor:

var propertyDescriptor = DependencyPropertyDescriptor.FromProperty(CurrentValueProperty, typeof(GraphControl));
propertyDescriptor.AddValueChanged(this, OnCurrentValueChanged);
Run Code Online (Sandbox Code Playgroud)

或者使用UIPropertyMetaData:

new UIPropertyMetadata(0d, OnCurrentValueChangedCallback)
Run Code Online (Sandbox Code Playgroud)

所以回调的存根看起来像:

private void Callback(object sender, EventArgs e){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

好现在问题是,当值没有明确更改时,不会触发回调.我检查过,PropertyChanged事件在我的viewmodel中触发,但控件没有看到更改.当值更改为新值时,它将按预期处理回调.
有没有办法覆盖这种行为,以便我的回调方法总是被击中?

编辑:
我也尝试使用CoerceValueCallback,并且当值保持不变时,它会被击中,但它不会帮助我解决我的问题...

Kie*_*one 5

您可以将值包装在一个对象中,即创建一个类来保存它-然后每次将属性设置为包含新值的该类的新实例。这意味着您每秒要创建约10个对象,但是每个对象都是不同的,它们会触发change事件,并且很小(无论如何都将被GC处理)。:)