PropertyChanged
Die Components und Forms implementieren das Standard-Interface INotifyPropertyChanged.
Das Event konsumieren
Über das Event PropetyChanged
werden Änderungen an Properties gemeldet. Dieses Event transportiert als Argument PropertyChangedEventArgs
mit der Eigenschaft PropertyName
.
oArticle.PropertyChanged += OnArticleChanged;
// Der EventHandler:
protected void OnArticleChanged(object sender, PropertyChangedEventArgs args)
{
// reagieren auf Änderungen
}
Prüfung des Property-Namen
Um gezielt auf die Änderung bestimmter Properties zu reagieren muss die eigenschaft PropertyName ausgewertet werden. Dabei müssen auch einige Sonderfälle beachtet werden.
Ist der PropertyName leer (null
oder Empty
) bedeutet, dass sich alle Properties geändert haben. Genauso sollte man es auch betrachten, wenn gar keine EventArgs übergeben werden.
// Ausführliche Prüfung
if (args == null || string.IsNullOrEmpty(args.PropertyName) || args.PropertyName == nameof(sArticleID))
...
Framework Studio bietet mit der Methode IsProperty
eine praktische Erweiterung, um diese Prüfung zu vereinfachen. Man kann dieser Methode bei bedarf auch mehrere Property-Namen übergeben.
// Einfache Prüfung analog zu oben
if ( args.IsProperty(nameof(sArticleID)) )
...
// mit mehreren Properties:
if ( args.IsProperty(nameof(decPrice1), nameof(decPrice2)) )
// ein Preis hat sich geändert ...
Soll bewusst auf die Änderung exakt eines Properties gehört werden - also nicht wenn sich alles ändert - dann ist die folgende Schreibweise zu empfehlen:
// Es wurde explizit die Artikel-Nummer geändert
if ( args?.PropertyName == nameof(sArticleID) )
...
Generell ist es empfehlenswert, wie in den Beispielen demonstriert, mit nameof(...)
zu arbeiten, damit die Namen der Properties vom Compiler geprüft werden.
Das kann auf je nach Situation auf eine der folgenden Arten passieren
- Das Property direkt in der eigenen Klasse:
nameof(this.sArticleID)
- Das Property an einer vorhandenen Instanz:
nameof(oArticle.sArticleID)
- Das Property über das Interface oder die Klasse verwenden.
nameof(IcdArticle.sArticleID)
Aufrufen des Events
Innerhalb der Component bzw. des Forms kann das Event durch Aufruf der Methode FirePropertyChanged(string propertyName)
ausgelöst werden.
Ach hier gilt: wird als PropertyName der Wert null
oder String.Empty
übergeben, bedeutet es, dass sich alles geändert hat.
Davon sollte allerdings nur sehr bedacht Gebrauch gemacht werden.