ホームページ >バックエンド開発 >C++ >C# でプロパティ値の変更に対してイベントを発生させる方法は?

C# でプロパティ値の変更に対してイベントを発生させる方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-28 13:57:09345ブラウズ

How to Raise Events for Property Value Changes in C#?

プロパティ値の変更に対してイベントを発生させる

プロパティを操作する場合、プロパティの値が変更されるたびにイベントをトリガーする必要が生じる場合があります。

質問:

値が変更されるたびにイベントを発生させる必要がある 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;
}

この実装の特徴:

  • プロパティ変更通知メソッドが抽象化されており、他のプロパティに簡単に適用できます。
  • PropertyChanged デリゲートは、競合を避けるために呼び出される前にコピーされます。
  • INotifyPropertyChanged インターフェイスが正しく実装されています。

追加のプロパティ固有イベント:

イベントも作成したい場合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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。