DependencyProperty ValueChanging Event
本文关键字:Event ValueChanging DependencyProperty | 更新日期: 2023-09-27 18:16:01
我目前使用以下代码来通知当DependencyProperty
的Value
已经改变:
DependencyPropertyDescriptor propDescriptor = DependencyPropertyDescriptor.FromProperty(property, control.GetType());
propDescriptor.AddValueChanged(control, controlChangedHandler);
这工作得很好,很简单,但我现在真正需要的是当一个DependencyProperty
的Value
即将改变时得到通知。我认为会有一个DependencyPropertyDescriptor.AddValueChanging()
方法,但它似乎不存在。有什么想法可以创建这个功能吗?
我需要能够取消更改,触发一些异步后端逻辑,并且只有当后端逻辑成功时,控件的属性才真正更改。
我通过在INotifyPropertyChanged
实现中包装我的IODevice并将其绑定到DependencyProperty
来解决手头的问题。
神奇之处在于IODeviceWrapper.Value
的setter实际上并不设置值,而是设置IO。结果是,当setter被它绑定的DependencyProperty
调用时,还没有将更改提交给DependencyProperty
的值。因此,IODeviceWrapper.Value
的setter被DependencyProperty
的sudo-不存在的ValueChanging
事件调用。
此时,如果DependencyProperty
从Value
的getter中读取,它将获得旧的值,直到IO完成。当IO完成后,IODeviceWrapper.Value
的PropertyChanged
事件被触发,然后DependencyProperty
读取新的值。
我有缺陷的设计现在完美无缺了。这里是代码,以防其他人感兴趣。忽略那些反对者。
public class IODeviceWrapper : INotifyPropertyChanged
{
public IODeviceWrapper(IODevice ioDevice)
{
_ioDevice = ioDevice;
_ioDevice.ValueChanged += ValueChanged;
}
private IODevice _ioDevice;
public event PropertyChangedEventHandler PropertyChanged;
private void ValueChanged()
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}
}
public int Value
{
get { return _ioDevice.Value; }
set
{
//Do ansynchronous IO
Task task = new Task(() => _ioDevice.DoIO(value));
task.Start();
}
}
}