Ich verwende die folgende Erweiterungsmethode (mit C# 6.0), um die INPC-Implementierung so einfach wie möglich zu gestalten:
public static bool ChangeProperty<T>(this PropertyChangedEventHandler propertyChanged, ref T field, T value, object sender,
IEqualityComparer<T> comparer = null, [CallerMemberName] string propertyName = null)
{
if (comparer == null)
comparer = EqualityComparer<T>.Default;
if (comparer.Equals(field, value))
{
return false;
}
else
{
field = value;
propertyChanged?.Invoke(sender, new PropertyChangedEventArgs(propertyName));
return true;
}
}
Die INPC-Implementierung läuft auf Folgendes hinaus (Sie können dies entweder jedes Mal implementieren oder eine Basisklasse erstellen):
public class INPCBaseClass: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected bool changeProperty<T>(ref T field, T value,
IEqualityComparer<T> comparer = null, [CallerMemberName] string propertyName = null)
{
return PropertyChanged.ChangeProperty(ref field, value, this, comparer, propertyName);
}
}
Dann schreiben Sie Ihre Eigenschaften wie folgt:
private string testProperty;
public string TestProperty
{
get { return testProperty; }
set { changeProperty(ref testProperty, value); }
}
HINWEIS: Sie können die [CallerMemberName]
Erklärung in der Erweiterungsmethode, wenn Sie wollen, aber ich wollte es flexibel halten.
Wenn Sie Eigenschaften ohne ein Hintergrundfeld haben, können Sie die changeProperty
:
protected bool changeProperty<T>(T property, Action<T> set, T value,
IEqualityComparer<T> comparer = null, [CallerMemberName] string propertyName = null)
{
bool ret = changeProperty(ref property, value, comparer, propertyName);
if (ret)
set(property);
return ret;
}
Ein Anwendungsbeispiel wäre:
public string MyTestProperty
{
get { return base.TestProperty; }
set { changeProperty(base.TestProperty, (x) => { base.TestProperty = x; }, value); }
}
0 Stimmen
Siehe stackoverflow.com/questions/1329138/ für eine compilergeprüfte Art der Implementierung von INotifyPropertyChanged. Vermeidung von Eigenschaftsnamen als magische Zeichenkette.
8 Stimmen
code.google.com/p/notifypropertyweaver kann von Nutzen sein
9 Stimmen
Obiger Link ist tot. github.com/SimonCropp/NotifyPropertyWeaver
1 Stimmen
Obwohl ich adäquate Alternativen hatte, war nichts für mein Team so schmerzlos wie die Postsharp-Lösung Domänen-Toolkit (wird mit normalem Postsharp in der kommenden v3.0 gebündelt werden, denke ich). [NotifyPropertyChanged] auf die Klasse, [NotifyPropertyChangedIgnore] auf die Requisiten zu ignorieren.
3 Stimmen
Sie könnten stattdessen DependencyObject und DependencyProperties verwenden. HA! Ich habe einen Witz gemacht.
0 Stimmen
@Codest und jetzt ist dein Link tot
7 Stimmen
@joao2fast4u github.com/Fody/PropertyChanged/wiki/
0 Stimmen
Ich stimme mit dem Auftraggeber überein. Es ist wirklich traurig, dass es das in Roslyn noch nicht gibt. Außerdem muss es eine Möglichkeit geben, zu vermerken, dass eine Eigenschaft vom Wert einer anderen abhängig ist (idealerweise mit Attributen und dem nameof-Operator).
6 Stimmen
Zu dieser Zeit war es nicht möglich, Änderungen an C# vorzunehmen, da wir ein riesiges Backlog mit Abhängigkeiten hatten. Damals, als MVVM geboren wurde, haben wir uns nicht sonderlich um die Lösung dieses Problems bemüht, und ich weiß, dass das Patterns & Practices-Team ein paar Versuche unternommen hat (daher haben Sie auch MEF als Teil dieses Forschungs-Threads erhalten). Heute denke ich, dass [CallerMemberName] die Antwort auf das obige Problem ist.
0 Stimmen
Ich glaube, @tom-gilder hat eine bessere Antwort. stackoverflow.com/a/18002490/4062881
0 Stimmen
ObservableCollection
eliminiert die Notwendigkeit der ImplementierungOnPropertyChanged
für einfache Situationen. Siehe So geht's: Erstellen und Binden an eine ObservableCollection y ObservableCollection .