Maison >développement back-end >C++ >Comment déclencher des événements pour les changements de valeur de propriété en C# ?

Comment déclencher des événements pour les changements de valeur de propriété en C# ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-28 13:57:09345parcourir

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

Déclencher des événements pour les changements de valeur de propriété

Lorsque vous travaillez avec des propriétés, vous pouvez rencontrer le besoin de déclencher un événement chaque fois que la valeur de la propriété change.

Question :

Il y a une propriété nommée ImageFullPath1 qui nécessite le déclenchement d'un événement chaque fois que sa valeur change. Malgré l'existence de INotifyPropertyChanged, l'exigence est d'implémenter la solution à l'aide d'événements.

Réponse :

L'interface INotifyPropertyChanged est en effet basée sur des événements. Il a un seul membre, PropertyChanged, qui est un événement auquel les consommateurs peuvent s'abonner.

Cependant, la solution suggérée par Richard n'est pas fiable. Une implémentation plus sûre est :

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;
}

Caractéristiques de cette implémentation :

  • Les méthodes de notification de changement de propriété sont abstraites, permettant une application facile à d'autres propriétés.
  • Le délégué PropertyChanged est copié avant d'être invoqué pour éviter les conditions de concurrence.
  • Il implémente correctement l'interface INotifyPropertyChanged.

Événements supplémentaires spécifiques à une propriété :

Si vous souhaitez également créer un événement pour les modifications d'une propriété spécifique, telle que ImageFullPath, vous pouvez ajouter :

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

public event EventHandler ImageFullPathChanged;

Appeler OnImageFullPathChanged(EventArgs.Empty) après OnPropertyChanged("ImageFullPath").

CallerMemberAttribute dans .Net 4.5 :

Dans .Net 4.5 et supérieur, CallerMemberAttribute vous permet de supprimer le nom de propriété codé en dur dans la source code :

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();
        }
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn