ホームページ > バックエンド開発 > C++ > プロパティ値変更通知用に INotifyPropertyChanged を安全に実装するにはどうすればよいですか?

プロパティ値変更通知用に INotifyPropertyChanged を安全に実装するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-30 13:51:10
オリジナル
212 人が閲覧しました

How to Safely Implement INotifyPropertyChanged for Property Value Change Notifications?

イベントを使用してプロパティ値の変更を通知する方法

プロパティ値の変更を監視するには、PropertyChanged イベントを含む INotifyPropertyChanged インターフェイスを利用できます。 。コンシューマはこのイベントをサブスクライブして、特定のプロパティの変更を検出できます。

public interface INotifyPropertyChanged
{
    event PropertyChangedEventHandler PropertyChanged;
}
ログイン後にコピー

イベントによる INotifyPropertyChanged の安全な実装

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;
}
ログイン後にコピー

この実装:

  • 複数のプロパティに簡単に適用できるようにプロパティ変更通知メソッドを一元化します。
  • コピーを作成することで競合状態を回避します。 PropertyChanged デリゲートの。
  • INotifyPropertyChanged に完全に準拠します。 Interface.

追加の特定のプロパティ変更イベント

さらに粒度を高めるために、次のような特定のプロパティに対して個別のイベントを定義できます。

protected void OnImageFullPathChanged(EventArgs e)
{
    EventHandler handler = ImageFullPathChanged;
    if (handler != null)
        handler(this, e);
}

public event EventHandler ImageFullPathChanged;
ログイン後にコピー

プロパティのセッターで、一般的な OnPropertyChanged イベントと特定の OnPropertyChanged イベントの両方を呼び出します。 OnImageFullPathChanged イベント。

プロパティ名の取得の簡素化 (C# 4.5 のみ)

最後に、C# 4.5 以降では、CallerMemberAttribute を利用してプロパティ名を自動的に抽出し、手動文字列リテラルが必要:

protected void OnPropertyChanged(
        [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }
ログイン後にコピー

以上がプロパティ値変更通知用に INotifyPropertyChanged を安全に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート