Laden...

NotifyPropertyChanged für alle Properties, Reihenfolge???

Erstellt von sth_Weird vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.733 Views
S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 8 Jahren
NotifyPropertyChanged für alle Properties, Reihenfolge???

Hallo,
ich habe in meiner Applikation das MVVM Pattern verwendet, meine ViewModels implementieren INotifyPropertyChanged.
In die Models haben ich Memento Support eingebaut, wenn ich im View dann auf Abbrechen klicke dann wird im ViewModel der Cancel-Command gefeuert, dieser ruft im Model eine RestoreMemento() Funktion auf die die Werte zurücksetzt. Das führt natürlich nun dazu, dass die Werte in der Oberfläche auch aktualisiert werden müssen... Korrekt müsste nun für alle Properties im VM die im View verwendet werden das NotifyPropertyChanged aufgerufen werden, damit das View mitkriegt, dass sich was geändert hat.
Laut MSDN wird dies auch gemacht (also laut Hilfe "alle Properties"), wenn man beim NotifyPropertyChanged Event in die EventArgs null oder einen leeren String als Parameter übergibt, anstelle des Namens des Properties.
Dazu ein paar Fragen, die leider in bei MSDN nicht beantwortet wird und zu der ich auch nichts weiteres gefunden habe:

  • betrifft das nur die Properties, die im View auch verbunden sind (zur Laufzeit weiß die Anwendung ja welche das sind), oder alle Properties, die in der VM Klasse sind (und einen getter haben)?
  • Wie ist die Reihenfolge, in welcher die Events gefeuert werden? Alphabetisch, zufällig oder in der Reihenfolge, wie sie im View verbunden sind?

gruß & thx
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

P
157 Beiträge seit 2014
vor 8 Jahren

Hallo,

für "Undo" gibt es mehrere Möglichkeiten, die einfachste ist : Klonen...klone das Objekt deiner Begierde und übertrage bei einem OK alle Werte in dein original, ist leichter als sich alle Änderungen zu merken. Memento ist interessant, wenn du das für deine Anzeige verwenden möchtest. Ich hätte es eher so verwendet, nach einem Restore die Viewmodels neu zu bauen - falls du welche für deine Models hast - oder die Modelreferenzen neu zu setzen, da sie im endeffekt komplett ungültig geworden sind.

Das mit dem Leerstring ist etwas fragil, dürfte nur Eigenschaften betreffen die gebunden sind und nicht als OneTime-Binding deklariert wurden, alles andere kann ich mir nur schwer vorstellen.

Für die Reihenfolgefrage gibt meiner Meinung nach nur 2 Optionen : Reihenfolge in deiner Klasse - weil : reflection, oder Reihenfolge des Binding im xaml...ich tippe mal auf die 2.

Das Xaml-binding baut intern eine Liste von Binding-informationen auf, ich vermute mal das diese liste dann abgearbeitet wird.

vg

Wenn's zum weinen nicht reicht, lach drüber!

S
sth_Weird Themenstarter:in
469 Beiträge seit 2007
vor 8 Jahren

Danke schonmal für deine Antwort, mein Memento arbeitet intern auch mit einer Kopien des Originalobjekts. Nach außen soll sich die Instanz selber aber nicht ändern.Die Memento-Funktionalität ist bei mir bewusst im Model angesiedelt.
Vielleicht kann jemand noch was genaueres zur Funktionsweise und Reihenfolge sagen...ich wüsste leider nicht wie (verlässlich) testen, außer irgendwelche Debug-Ausgaben einzuführen...
Alternativ wäre es natürlich möglich eine Art Funktion UpdateAll() zu implementieren, die alle PropertyChanged in der Reihenfolge aufruft wie man sie in der Oberfläche braucht, aber wenn das mit dem null schon das gleiche macht, wäre das unnütz und außerdem fehleranfällig...

gruß
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

5.658 Beiträge seit 2006
vor 8 Jahren

Hi sth_Weird,

Vielleicht kann jemand noch was genaueres zur Funktionsweise und Reihenfolge sagen...ich wüsste leider nicht wie (verlässlich) testen, außer irgendwelche Debug-Ausgaben einzuführen...

Was meinst du damit? Welche Reihenfolge meinst du? Und warum sollte die Reihenfolge wichtig sein zum Testen?

Christian

Weeks of programming can save you hours of planning

P
157 Beiträge seit 2014
vor 8 Jahren

Holla,

also ich muss mal raten, weil aus deiner Fragestellung heraus vermute ich dass du dein memento testen möchtest ? Oder gehts dir nu um die reihenfolge?

Wenn du nen UnitTest für dein event invoke schreibst, wird nix passieren...der/die/das/the event wird zwar ausgelöst, aber hat keine abonnenten, die bekommst du erst beim Binding...mich wunderts wozu du da ne Reihenfolge brauchst, da kannst du nur Trace .WriteLine machen...jedenfalls wär alles andere sinnfrei.

Falls dein Code auf ner Reihenfolge deiner Property-Setter basiert 😃 solltest du ggf mal deinen Code refaktorieren...du kannst später schlecht vorschreiben Property A vor Property B...hält sich kein Mensch dran und man selbst denkt 2 Wochen später auch nicht mehr dran - ist auch ganz uncool, wenn du mit reflection arbeitst oder komponenten benutzt, die mit reflection arbeiten...

vg

Wenn's zum weinen nicht reicht, lach drüber!