プロパティ値の変更に対してイベントを発生させる
プロパティを操作する場合、プロパティの値が変更されるたびにイベントをトリガーする必要が生じる場合があります。
質問:
値が変更されるたびにイベントを発生させる必要がある ImageFullPath1 という名前のプロパティがあります。 INotifyPropertyChanged が存在するにもかかわらず、要件はイベントを使用してソリューションを実装することです。
回答:
INotifyPropertyChanged インターフェイスは実際にイベントに基づいています。これには、消費者がサブスクライブできるイベントである PropertyChanged という単一のメンバーがあります。
ただし、Richard が提案した解決策は信頼できません。より安全な実装は次のとおりです。
public class MyClass : INotifyPropertyChanged { private string imageFullPath; protected void OnPropertyChanged(PropertyChangedEventArgs e) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) handler(this, e); } protected void OnPropertyChanged(string propertyName) { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } public string ImageFullPath { get { return imageFullPath; } set { if (value != imageFullPath) { imageFullPath = value; OnPropertyChanged("ImageFullPath"); } } } public event PropertyChangedEventHandler PropertyChanged; }
この実装の特徴:
追加のプロパティ固有イベント:
イベントも作成したい場合ImageFullPath などの特定のプロパティを変更するには、次のことができます。追加:
protected void OnImageFullPathChanged(EventArgs e) { EventHandler handler = ImageFullPathChanged; if (handler != null) handler(this, e); } public event EventHandler ImageFullPathChanged;
OnPropertyChanged("ImageFullPath") の後に OnImageFullPathChanged(EventArgs.Empty) を呼び出します。
.Net 4.5 の CallerMemberAttribute:
.Net 4.5 以降では、 CallerMemberAttribute を使用すると、ソース コード内のハードコーディングされたプロパティ名を削除できます:
protected void OnPropertyChanged( [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "") { OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); } public string ImageFullPath { get { return imageFullPath; } set { if (value != imageFullPath) { imageFullPath = value; OnPropertyChanged(); } } }
以上がC# でプロパティ値の変更に対してイベントを発生させる方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。