PropertyChangedイベントハンドラで古い値、新しい値とプロパティ名を取得する必要があります。 INotifyPropertyChangedのデフォルトの実装では、プロパティの名前のみが提供されます。インターネット上で検索した結果、プロパティの拡張実装が変更されたのと同様の質問がありました。以下はC#でPropertyChangedイベントのINotifyPropertyChanged実装で古い値と新しい値を取得する方法
そのQとのインタフェース宣言へのリンクです:
NotifyPropertyChanged event where event args contain the old value
public interface INotifyPropertyChangedExtended<T>
{
event PropertyChangedExtendedEventHandler<T> PropertyChanged;
}
パブリックデリゲート無効PropertyChangedExtendedEventHandler(オブジェクト送信者、PropertyChangedExtendedEventArgs E)。
上記のインターフェイスで問題は解決しますが、プロパティのデータ型によってTが変わるため、Entityクラスに汎用インターフェイスを実装する方法がわかりません。
誰でも私を理解する助けができますか?Tパラメータでこのインターフェイスを実装することは可能でしょうか。これのサンプル実装は本当に役に立ちます。
ご協力いただきありがとうございます。
Umesh
EDIT#1:ピーターからの回答をもとに 、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()));
}
}
ありがとうございました。 Tを使う代わりに、古い値と新しい値の文字列型を使って解決しました。監査の場合は、各プロパティの古い値と新しい値を取得し、DBに格納してレポートする必要があります。 –