我需要在PropertyChanged事件处理程序中捕获旧值、新值和属性名称。INotifyPropertyChanged的默认实现仅提供属性的名称。因此,在互联网上搜索后,我找到了类似的问题,其中包含了扩展实现的属性更改。
以下是该问题的链接和接口声明:
NotifyPropertyChanged事件,其中事件参数包含旧值
public interface INotifyPropertyChangedExtended<T>
{
event PropertyChangedExtendedEventHandler<T> PropertyChanged;
}
public delegate void PropertyChangedExtendedEventHandler(object sender, PropertyChangedExtendedEventArgs e);
上述接口可以解决我的问题,但是我不知道如何在实体类上实现通用接口,因为T将根据属性的数据类型而改变。
有人能帮我理解吗?是否可能使用T参数实现此接口。示例实现将非常有帮助。
提前感谢您的帮助。
Umesh
编辑#1: 根据Peter的回复,发布更新后的代码,这可能对想要在PropertyChanged事件中捕获旧值和新值的人有用。
public class PropertyChangedExtendedEventArgs : PropertyChangedEventArgs
{
public string OldValue { get; set; }
public string NewValue { get; set; }
public PropertyChangedExtendedEventArgs(string propertyName, string oldValue, string newValue) : base(propertyName)
{
OldValue = oldValue;
NewValue = newValue;
}
}
//
// Summary:
// Notifies clients that a property value has changed.
public interface INotifyPropertyChangedEnhanced
{
//
// Summary:
// Occurs when a property value changes.
event PropertyChangedEventHandlerEnhanced PropertyChanged;
}
public delegate void PropertyChangedEventHandlerEnhanced(object sender, PropertyChangedExtendedEventArgs e);
public abstract class BindableBase : INotifyPropertyChangedEnhanced
{
public event PropertyChangedEventHandlerEnhanced PropertyChanged;
protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName]
string propertyName = null)
{
if (Equals(storage, value))
{
return false;
}
var oldValue = storage;
storage = value;
this.OnPropertyChanged(oldValue, value, propertyName);
return true;
}
protected void OnPropertyChanged<T>(T oldValue, T newValue, [CallerMemberName] string propertyName = null)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedExtendedEventArgs(propertyName, oldValue?.ToString(), newValue?.ToString()));
}
}