Ich versuche gerade, eine kleine Anwendung nach dem MVVM-Muster zu erstellen. Allerdings weiß ich nicht wirklich, wie man richtig verpacken aggregierte Modellklassen in meinem ViewModel. Nach dem, was ich über MVVM weiß, sollen Sie keine Modelle in Ihrem ViewModel als Eigenschaften anzeigen, da Sie sonst direkt von Ihrer Ansicht aus an das Modell binden könnten. Es scheint also, dass ich das verschachtelte Model in ein anderes ViewModel verpacken muss, aber das bringt einige Probleme mit sich, wenn ich Model und ViewModel später synchronisiere.
Wie kann man das also effizient machen?
Ich werde ein kurzes Beispiel geben. Nehmen wir an, ich habe die folgenden Modellklassen:
public class Bar
{
public string Name { get; set; }
}
public class Foo
{
public Bar NestedBar { get; set; }
}
Nun erstelle ich zwei entsprechende ViewModel-Klassen, die die Models umhüllen, stoße aber auf Probleme mit dem FooViewModel:
public class BarViewModel
{
private Bar _bar;
public string Name
{
get { return _bar.Name; }
set { _bar.Name = value; }
}
}
public class FooViewModel
{
private Foo _foo;
public BarViewModel Bar
{
get { return ???; }
set { ??? = value; }
}
}
Was mache ich nun mit der Bar-Eigenschaft von FooViewModel? Damit "get" funktioniert, muss ich eine BarViewModel-Instanz zurückgeben. Erstelle ich ein neues Feld dieses Typs in FooViewModel und verpacke das _foo.NestedBar-Objekt einfach darin? Änderungen an den Eigenschaften dieses Feldes sollten sich auf die zugrunde liegende Bar-Instanz übertragen, richtig?
Was ist, wenn ich dieser Eigenschaft eine andere BarViewModel-Instanz zuweisen muss, etwa so:
foo.Bar = new BarViewModel();
Jetzt wird das nicht auf das Modell übertragen, das immer noch die alte Instanz des Typs Bar enthält. Ich müsste ein neues Bar-Objekt erstellen, das auf dem neuen BarViewModel basiert und es _foo zuordnen, aber wie kann man das elegant machen? In diesem Beispiel ist es ziemlich trivial, aber wenn Bar viel komplexer ist und viele Eigenschaften hat, wäre das eine Menge Tipparbeit... ganz zu schweigen davon, dass es sehr fehleranfällig wäre, wenn man vergisst, eine der Eigenschaften zu setzen.