Laden...

Standardimplementation von INotifyPropertyChanged

Erstellt von JuyJuka vor 15 Jahren Letzter Beitrag vor 15 Jahren 6.570 Views
JuyJuka Themenstarter:in
2.187 Beiträge seit 2005
vor 15 Jahren
Standardimplementation von INotifyPropertyChanged

Hallo,

Beschreibung:
Dies ist eine Standardimplementation von INotifyPropertyChanged. Diesen Code kann man ungesehen in eine Klasse einfügen, die INotifyPropertyChanged implementieren soll und dadurch das Event schenll und sicher auslösen.

(( Der Code stammt ursprünglich nicht von mir, sonder hier aus dem Forum, leider finde ich den Thread nicht mehr und auch den uhrsprünglichen Poster. ))

    #region INotifyPropertyChanged Member
    /// <summary>
    /// Tritt ein, wenn sich ein Eigenschaftenwert ändert.
    /// </summary>
    public virtual event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Prüft ob sich der alte Wert und der neu Wert unterscheiden. Wenn dies der Fall ist, wird der alte Wert überschrieben und das <see cref="E:PropertyChanged"/>-Event ausgelöst.
    /// </summary>
    /// <typeparam name="T">Der Typ der Werte.</typeparam>
    /// <param name="propertyName">Der Name des Properties, das überprüft wird.</param>
    /// <param name="oldValue">Der alte Wert, normal das vom Property gekapselte Feld.</param>
    /// <param name="newValue">Der neue Wert, normal <c>value</c> des <c>set</c>-Operators des Properties.</param>
    /// <returns>Giebt <c>true</c> zurück, wenn oldValue gegegen newValue ausgetauscht wurde, ansonsten <c>false</c>.</returns>
    protected bool VerursachePropertyChanged<T>(string propertyName, ref T oldValue, ref T newValue)
    {
      if (oldValue == null && newValue == null)
      {
        return false;
      }
      if ((oldValue == null && newValue != null) || !oldValue.Equals((T)newValue))
      {
        oldValue = newValue;
        this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
        return true;
      }
      return false;
    }

    /// <summary>
    /// Löst das <see cref="E:PropertyChanged"/>-Event aus.
    /// </summary>
    /// <param name="e">Die <see cref="System.ComponentModel.PropertyChangedEventArgs"/> enthält die Daten für das Event.</param>
    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
    {
      if (this.PropertyChanged != null)
      {
        this.PropertyChanged(this, e);
      }
    }
    #endregion

Hier der Code, wie man die Methoden verwendet:


public T MyProperty
{
  get { return this._MyProperty; }
  set { VerursachePropertyChanged("MyProperty",ref this._MyProperty, ref value); }
}

Schlagwörter: INotifyPropertyChanged

3.971 Beiträge seit 2006
vor 15 Jahren

Hallo JuyJuka,
Wobei noch zu sagen wäre, dass die Überladung der Funktion OnPropertyChanged(string) zur einfacheren Handhabung von OnPropertyChanged führt.


protected void OnPropertyChanged(string propertyName) {
  this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

JuyJuka Themenstarter:in
2.187 Beiträge seit 2005
vor 15 Jahren

Hallo kleines_eichhoernchen,

Diese Überladung sollte ich noch einfügen, ist wirklich nützlich.
Jedoch hat die VerursachePropertyChanged-Methode noch einen großen Vorteil dieser überladung gegenüber: Sie Prüft selbstständig ob das Event ausgelöst werden muss oder nicht.

Gruß
Juy Juka

C
3 Beiträge seit 2008
vor 15 Jahren

Hi,

es macht zwar keinen großen Unterschied, aber wäre

protected bool VerursachePropertyChanged<T>(string propertyName, ref T oldValue, T newValue)

nicht sinnvoller. Außerdem erspart es einem jedesmal vier Tasten 😉

JuyJuka Themenstarter:in
2.187 Beiträge seit 2005
vor 15 Jahren

Hi Codi++,

Jup, könnte man machen.
Ich hab keine Einwände, wenn jemand eine Modifizierte Version des Snipptes Postet.

Gruß
Juy Juka