2011-01-11 2 views
5

alt textZugang MVVM Elternansicht Modell aus Sammlung

Das Bild zeigt über mein Programm. Pfeile zeigen Binding an.

Mein MainWindow.xaml hat seinen Datenkontext als MainVM festgelegt.

Das Fenster hat eine Registersteuerung, die an eine ObservableCollection von ViewModel s gebunden ist. Unter Verwendung einer Datenvorlage zeigt das Registerkarten-Steuerelement Ansichten an, die dem ViewModel entsprechen.

Die ObservableCollection ist in MainVM gefunden.

Wie greife ich auf Eigenschaften in MainVM von ViewModel (in der ObservableCollection eingeschlossen)?

Ich bin offen für Antworten, die eine Änderung meines Programmiermodells erfordern.

Antwort

6

Aufbauend auf, was Kent sagte. . .

Aus architektonischer Sicht sollte Ihre ViewModel-Klasse nichts über MainVM wissen müssen. Alles, was es wissen muss, sollte an die Instanz von ViewModel weitergegeben werden, damit es atomar bleibt und sich nicht um Dinge kümmern muss, die es aufrufen. Aus der Sicht von SOLID ist dies das Dependency Inversion-Prinzip.

Auf welche Eigenschaften von MainVM innerhalb von ViewModel zugegriffen werden muss, sollte als Teil der Konstruktion der Instanz von ViewModel übergeben werden. Persönlich bin ich ein Fan von ihnen in einem Konstruktor, aber Sie könnten sie auch als Eigenschaften verfügbar machen.

Eine Overkill-Methode (die ich nicht empfehle), richtet Ihren Konstruktor so ein, dass er eine Instanz von MainVM übernimmt und this im Konstruktor übergibt. z.B .:

public class ViewModel 
{ 
    private readonly MainVM _parent; 

    public MainVM Parent => _parent; 

    public ViewModel(MainVM parent) 
    { 
      _parent = parent; 
    } 
} 

dann, wenn Sie erstellen Ihre Ansichtsmodell können Sie einfach:

ViewModel vm = new ViewModel(this); 
+1

ich mein Programm änderte sich mit der Abhängigkeit Inversion Prinzip zu arbeiten.Anstelle der MainVM, die die Eigenschaft enthält, enthalten meine ViewModels die Eigenschaft und werden über die MainVM synchronisiert. –

+0

Warum ist es Overkill? Ich stimme der Idee der atomaren VMs zu, aber eine ähnliche Art der Elternbeziehung ist in Beispiel ((DataRow) Zeile) .Tabelle –

2

Wer erstellt Instanzen von ViewModel? Wenn es eine enge Beziehung zwischen MainVM und ViewModel gibt, dann sollte vielleicht ViewModel eine Instanz von MainVM in seinem Konstruktor nehmen.

Die Alternative besteht darin, ein anderes Design zu entwerfen, das ViewModel nicht benötigt, um Zugriff auf die MainVM zu haben. Dies erfordert mehr Informationen (und eine separate Frage).

4

Je nachdem, wie viel Interaktion Sie benötigen, können Sie den anderen Weg gehen, indem Sie Ereignisse aus der Klasse ViewModel auslösen und MainVM mit ihnen umgehen und Eigenschaften auf die einzelnen ViewModel entsprechend setzen.

Eine andere Möglichkeit wäre, wenn Sie die Ansichtsmodell Sammlung instanziiert (was ich davon ausgehen, ist irgendwo in MainVM getan?), Könnten Sie in MainVM als Konstruktor Parameter übergeben Sie einfach und halten und die Instanz von MainVM Innenseite jedes ViewModel.

Verwandte Themen