Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Standardimplementation von INotifyPropertyChanged
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2282
Herkunft: Deutschland

Themenstarter:

Standardimplementation von INotifyPropertyChanged

beantworten | zitieren | melden

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
Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von JuyJuka am .
Attachments
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 4055
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2282
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Codi++
myCSharp.de - Member



Dabei seit:
Beiträge: 3

beantworten | zitieren | melden

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 ;)
private Nachricht | Beiträge des Benutzers
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2282
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Hi Codi++,

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

Gruß
Juy Juka
private Nachricht | Beiträge des Benutzers