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中,我只是将Binding
CurrentValue设置为(启用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
,并且当值保持不变时,它会被击中,但它不会帮助我解决我的问题...
您可以将值包装在一个对象中,即创建一个类来保存它-然后每次将属性设置为包含新值的该类的新实例。这意味着您每秒要创建约10个对象,但是每个对象都是不同的,它们会触发change事件,并且很小(无论如何都将被GC处理)。:)