DependencyProperty ValueChanging Event

本文关键字:Event ValueChanging DependencyProperty | 更新日期: 2023-09-27 18:16:01

我目前使用以下代码来通知当DependencyPropertyValue已经改变:

DependencyPropertyDescriptor propDescriptor = DependencyPropertyDescriptor.FromProperty(property, control.GetType());
propDescriptor.AddValueChanged(control, controlChangedHandler);

这工作得很好,很简单,但我现在真正需要的是当一个DependencyPropertyValue 即将改变时得到通知。我认为会有一个DependencyPropertyDescriptor.AddValueChanging()方法,但它似乎不存在。有什么想法可以创建这个功能吗?

我需要能够取消更改,触发一些异步后端逻辑,并且只有当后端逻辑成功时,控件的属性才真正更改。

DependencyProperty ValueChanging Event

我通过在INotifyPropertyChanged实现中包装我的IODevice并将其绑定到DependencyProperty来解决手头的问题。

神奇之处在于IODeviceWrapper.Value的setter实际上并不设置值,而是设置IO。结果是,当setter被它绑定的DependencyProperty调用时,还没有将更改提交给DependencyProperty的值。因此,IODeviceWrapper.Value的setter被DependencyProperty的sudo-不存在的ValueChanging事件调用。

此时,如果DependencyPropertyValue的getter中读取,它将获得旧的值,直到IO完成。当IO完成后,IODeviceWrapper.ValuePropertyChanged事件被触发,然后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();
        }
    }
}