2009-05-23 11 views
6

Ich kann nicht richtig herausfinden, wie man das Ansichtsmodell über Änderungen im Modell informiert, ohne eine Menge UI-spezifische Dinge wie INotifyProperyChanged und INotifyCollectionChanged in meinem Modell hinzuzufügen oder Tonnen von verschiedenen Ereignissen zu erstellen und eine Menge Dinge zu tun das Gefühl, dass sie UI-spezifisch sind und außerhalb des Modells bleiben sollten.Wie behalten Sie die View-Logik aus dem Modell und der Geschäftslogik des View-Modells in MVVM heraus?

Sonst müsste ich einfach alle Geschäftslogik im View-Modell duplizieren, um sicherzustellen, dass alles auf dem neuesten Stand ist, und worauf kommt es dann an, das Modell zu haben?

Einer der kniffligen, die ich in meinem Modell habe, ist eine Eigenschaft einer "Kategorie" -Klasse. Sie können es sich als eine Baumstruktur vorstellen und die Eigenschaft ist alle Blattknoten-Nachkommen. Nun, im Modell wird diese Eigenschaft rekursiv durch alle ihre Kinder generiert, was alles gut und gut ist. Das Ansichtsmodell muss jedoch an diese Eigenschaft gebunden sein und muss wissen, wann es sich ändert. Sollte ich nur das Modell ändern, um das Ansichtsmodell unterzubringen? Wenn ich das tue, dann macht das View-Modell zu diesem Zeitpunkt wirklich nichts, das Modell erhebt alle notwendigen Benachrichtigungen über Änderungen und die Ansicht kann nur direkt an das Modell binden. Auch wenn das Modell etwas war, zu dem ich nicht die Quelle hatte, wie würde ich das umgehen?

Antwort

8

Ich stimme nicht zu, dass INotifyPropertyChanged und INotifyCollectionChanged UI-spezifisch sind. Sie befinden sich in Namespaces und Assemblys, die nicht an einen bestimmten UI-Stack gebunden sind. Aus diesem Grund setze ich dieses Verhalten normalerweise so niedrig wie möglich im System ein (normalerweise die Datenschicht).

Wenn es einen Grund gibt, warum Sie es nicht auf dieses Niveau bringen wollen, ist das in Ordnung. Sie können es auf einer höheren Ebene wie der Service- oder UI-Ebene einfügen. Sie müssen jedoch sicherstellen, dass alle Änderungen an den Datenstrukturen auch über diese Ebene erfolgen.

+0

Eigentlich INotifyCollectionChanged ist Teil von System.Collections.Specialized, die in WindowsBase.dll ist. Ich habe das immer merkwürdig gefunden. –

+0

Guter Punkt Cameron. Ich finde das gleichermaßen verwirrend. Aktualisieren meiner Antwort entsprechend ... –

+0

Hmm, ich denke, das einzige Mal, dass ich jemals von ihnen gehört habe, sind in WPF-Tutorials für Databinding Zwecke, aber ich denke, es gibt nichts inhärent WPF über sie als sie für WPF verwendet werden. – Davy8