Le site INotifyPropertyChanged
interface est mis en œuvre avec des événements. L'interface n'a qu'un seul membre, PropertyChanged
qui est un événement auquel les consommateurs peuvent s'abonner.
La version que Richard a postée n'est pas sûre. Voici comment implémenter cette interface en toute sécurité :
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;
}
Notez que cela fait les choses suivantes :
-
Abstraite les méthodes de notification de changement de propriété afin que vous puissiez facilement l'appliquer à d'autres propriétés ;
-
Fait une copie de la PropertyChanged
délégué avant en essayant de l'invoquer (si vous ne le faites pas, cela créera une situation de concurrence).
-
Met correctement en œuvre le INotifyPropertyChanged
interface.
Si vous voulez en outre, créer une notification pour un spécifique en cours de modification, vous pouvez ajouter le code suivant :
protected void OnImageFullPathChanged(EventArgs e)
{
EventHandler handler = ImageFullPathChanged;
if (handler != null)
handler(this, e);
}
public event EventHandler ImageFullPathChanged;
Ajoutez ensuite la ligne OnImageFullPathChanged(EventArgs.Empty)
après la ligne OnPropertyChanged("ImageFullPath")
.
Puisque nous avons .Net 4.5, il existe l'option CallerMemberAttribute
qui permet de se débarrasser de la chaîne codée en dur pour le nom de la propriété dans le code source :
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();
}
}
}