Consider the following built-in delegate:
public delegate void PropertyChangedEventHandler(object sender,
PropertyChangedEventArgs e);
Is it possible that I extend/overload/override the delegate to this signature:
public delegate void MyPropertyChangedEventHandler(object sender,
MyPropertyChangedEventArgs e);
where MyPropertyChangedEventArgs is declared as
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;
}
}
and the class that owns the event is declared as
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));
}
}
and event subscription should allow access to MyPropertyChangedEventArgs properties without needing to type cast the PropertyChangedEventArgs everywhere and still not lose the out-of-the-box XAML binding to the property.
Example use-case:
Bindable bindable = new Bindable();
bindable.PropertyChanged += (sender, args) =>
{
if (args.OldValue != null)
{
// Do Something
}
};