考虑以下内置委托:
public delegate void PropertyChangedEventHandler(object sender,
PropertyChangedEventArgs e);
我是否可以将委托扩展/重载/覆盖到此签名:
public delegate void MyPropertyChangedEventHandler(object sender,
MyPropertyChangedEventArgs e);
其中 MyPropertyChangedEventArgs 被声明为
public class MyPropertyChangedEventArgs : PropertyChangedEventArgs
{
public readonly object OldValue;
public readonly object NewValue;
public MyPropertyChangedEventArgs(string propertyName, object
oldValue, object newValue) : base(propertyName)
{
OldValue = oldValue;
NewValue = newValue;
}
}
并且拥有该事件的类被声明为
using System;
using System.ComponentModel;
// missing delegate decleration
public class Bindable : INotifyPropertyChanged
{
public event MyPropertyChangedEventHandler PropertyChanged;
private object _property;
public object Property
{
get { return property; }
set
{
var oldValue = _property;
_property = value;
OnPropertyChanged("Property", oldValue, value);
}
}
protected void OnPropertyChanged(string name, object oldValue,
object newValue)
{
if (oldValue != newValue && PropertyChanged != null)
PropertyChanged(this, new MyPropertyChangedEventArgs(name,
oldValue, newValue));
}
}
和事件订阅应该允许访问 MyPropertyChangedEventArgs 属性,而无需在任何地方键入 PropertyChangedEventArgs 并且仍然不会丢失与属性的开箱即用 XAML 绑定。
示例用例:
Bindable bindable = new Bindable();
bindable.PropertyChanged += (sender, args) =>
{
if (args.OldValue != null)
{
// Do Something
}
};