Beste Weg, um notify-Eigenschaft ändern, wenn das Feld in Abhängigkeit von einem anderen
Was ist der beste Weg, in c# zu Benachrichtigen Eigenschaft geändert auf ein Element, das Feld ohne set
aber get
abhängig von anderen Feldern ?
Beispiel :
public class Example : INotifyPropertyChanged
{
private MyClass _item;
public event PropertyChangedEventHandler PropertyChanged;
public MyClass Item
{
get
{
return _item;
}
protected set
{
_item = value;
OnPropertyChanged("Item");
}
}
public object Field
{
get
{
return _item.Field;
}
}
#if !C#6
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
#else
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
//=> can be called in a set like this:
//public MyClass Item { set { _item = value; OnPropertyChanged();} }
//OnPropertyChanged will be raised for "Item"
}
#endif
}
Was der beste Weg, um den Aufstieg PropertyChanged für "Field"
bei der Einstellung Item
? Ich wollte rufenOnPropertyChanged("Field");
bei der Einstellung Item
aber wenn ich hatte viele Felder der code wird schnell hässlich und wartbaren.
Edit:
Ich Frage mich, ob es eine Funktion/Methode/Attribut funktioniert dies so :
[DependOn(Item)]
public object Field
{
get
{
return _item.Field;
}
}
=> Wenn Item
änderungen, die alle die je Felder teilt die Eigenschaft geändert hat.
Gibt es die ?
du implementieren könntest INotify für
MyClass
Field
im MyClass
nicht ändern, dass die Instanz _item, die durch ein anderes ersetzt wird. In meinem Fall MyClass
enthält einen xml-text. Ich mache einen webRequest um eine neue Instanz von MyClass
und ich speichern Sie es auf _item
. _item.Field
können nicht notify-Eigenschaft geändert, weil Field
ist nur eine erhalten, die zum Parsen der xml-Datei.
InformationsquelleAutor A.Pissicat | 2016-08-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Weg ist, rufen Sie
OnPropertyChanged
mehrfach:Dies ist nicht sehr einfach zu warten, jedoch. Eine weitere option ist das hinzufügen eines setter zu Ihr kommen-nur-Eigenschaft, und legen Sie es von der anderen Eigenschaft:
Gibt es keinen integrierten Mechanismus für die Verwendung von Parametern zu verdeutlichen, dass diese Beziehung zwischen Eigenschaften, es wäre jedoch möglich, erstellen Sie eine helper-Klasse, könnte es für Sie tun.
Habe ich eine ganz einfache Beispiel, wie das Aussehen könnte hier:
Dies ist nicht sonderlich robust (zum Beispiel, könnten Sie schaffen eine zirkuläre Abhängigkeit zwischen Eigenschaften und die Eigenschaft verändert würde, stecken in einer unendlichen Rekursion situation). Es kann auch einfacher gemacht, mit einige .NET 4.5 und C#6 Funktionen, aber das überlasse ich allen, die als übung für den Leser. Es wird wahrscheinlich auch nicht handhaben Vererbung sehr gut.
Um diese Klasse zu verwenden:
Item
"ignorieren" - Felder, die von ihm abhängen, ich kann den Fokus nur auf die news-Felder. Mehr wartbar und können Fehler vermeidenIch entwickelte ein ähnliches Attribut (nicht siehe edit ^^) aber dein
PropertyChangedNotifier
sieht besser aus als mein code. Ich werde deinem Beispiel, danke. Ich werde nur hinzufügen, dass der test, wenndependent == propertyName
Für die Vollständigkeit der in Ihrem PropertyChangedNotifier erweitern Sie das Beispiel, wo einer Immobilie hängt von mehreren anderen Eigenschaften (stacking [DependsOn( "Item" )]).
Bearbeiten, stapeln funktioniert nicht, gibt compiler Fehlermeldung über doppelte Attribute... Sie vergaß hinzuzufügen, AllowMultiple = true, wie so [AttributeUsage(AttributeTargets.Eigenschaft AllowMultiple = true)]
Das Attribut Lösung ist eigentlich ein netter. Aber was ist, wenn
Item
waren in einer anderen Klasse? Dann können Sie diese Lösung verwenden. Ich beantwortete diese Frage in einer anderen Frage, wo die Lösung ist die gleiche, selbst wenn die Eigenschaft in einer anderen Klasse: stackoverflow.com/questions/43653750/...InformationsquelleAutor Kyle
Soweit ich weiß, gibt es keine eingebaute Methode. Ich in der Regel tun Sie dies:
Sie nicht über die entsprechende Logik in das Eigentum auf diese Weise. Es ist besser zu warten ist meiner Meinung nach so, und es ist klar, was die Methode macht.
Auch ich bevorzuge diese Methode, die ich gefunden irgendwo auf, SO dass anstelle des hartkodierten Namen in der Klasse (wenn der name der Eigenschaft ändert, bricht es).
OnPropertyChanged("MyString");
wirdOnPropertyChanged(GetPropertyName(() => MyString));
wo
GetPropertyName
ist:Nach diesem, jedes mal, wenn ich ändern Sie die Eigenschaft wie den Namen, die ich noch benennen Sie die Eigenschaft, überall habe ich
GetPropertyName
statt der Suche nach den hardcoded string-Werte.Ich bin auch gespannt über einen integrierten Weg, um die Abhängigkeit, also ich bin putting ein Liebling in da 🙂
InformationsquelleAutor Etienne Faucher
Obwohl in dieser Lösung die Veranstaltung ist nachwievor von den setter (also nicht genau was die Frage ist), gibt es eine schöne, überschaubare Weise für die Darstellung von Abhängigkeiten. Könnte jemand es nützlich finden.
Die Lösung ist, erstellen Sie einen benutzerdefinierten wrapper für die Auslösung von INotifyPropertyChanged events. Statt der Aufruf von OnPropertyChanged manuell definieren wir folgende mathods (vorzugsweise innerhalb einer Basisklasse, die wir zur späteren Wiederverwendung):
Diese Klasse bietet uns eine Möglichkeit der Einstellung einen Wert von einem bestimmten Bereich, ohne die Notwendigkeit zur Eingabe des namens einer proparty der call kommt von.
Wir haben auch eine Klasse definieren, die ermöglichen wird, verwenden Sie zum definieren von abhängigen Eigenschaften (Instanz dieser Klasse zurück SetPropertyValue mathod).
Es einfach speichert eine Referenz auf ein Objekt, das geändert wird und macht es möglich, zum übertragen einer Veranstaltung zur nächsten-Eigenschaften.
Mit diesem können wir das erstellen einer Klasse, abgeleitet von ViewModelBase wie diese:
InformationsquelleAutor Tomasz