2009-06-02 5 views
0

Hy Jungs!Best Practice für Eltern/Kind-View-Model-Beziehungen in MVVM mit Onyx?

Ich arbeite gerade an einem kleinen WPF-Projekt mit MVVM über das Onyx-Framework.

Meine Current Architektur ist wie folgt:

<DockPanel> 
    <Menu DockPanel.Dock="Top" Background="#cecece"> 
     <!-- Menu --> 
    </Menu> 

    <Grid> 
     <views:TranslationView x:Name="translationView" /> 
    </Grid> 
</DockPanel> 

Die Frage, die ich jetzt habe, ist, wie die Beziehung zwischen den beiden Viewmodels zu implementieren. Ich habe derzeit im Grunde nur das TranslationView ein eigenes ViewModel ohne Verbindung zum übergeordneten ViewModel.

Das Problem ist, dass ich einige Datei über das MainView öffnen und dann den Inhalt analysieren und in der TranslationView anzeigen können. Gibt es einen empfohlenen Weg, dies zu tun?

Ich dachte über die Verwendung des TranslationViewModel als eine Eigenschaft in der MainViewModel und dann als DataContext für die TranslationView, aber es scheint gegen Onyx Modell zu laufen, um das ViewModel durch einen Typ (kein Objekt) Verweis zu definieren.

Antwort

0

Onyx hat kein "Modell, um das ViewModel über einen Typ (kein Objekt)" zu definieren. Der angehängten Eigenschaft ViewModel kann eine Objektreferenz zugewiesen werden. Tatsächlich ist diese Eigenschaft ein Objekttyp und verwendet Zwang, um eine Typ-Instanz in eine Objektinstanz des angegebenen Typs zu ändern. Dies ist nur eine Annehmlichkeit. Sie können einfach einen Objektreferenz zuweisen, die auf beliebige Weise erstellt wurde.

Wie die meisten Fragen gibt es eine Reihe von Möglichkeiten, um Ihr Problem zu lösen. Die Lösung, die Sie erwähnen, aber entlassen, weil Sie dachten, dass sie gegen das Design von Onyx gerichtet ist, ist eine, die funktionieren könnte, aber ich würde zögern zu verwenden, einfach weil es eine engere Kopplung schafft. Eine andere Lösung wäre, das Event-Aggregator-Muster zu verwenden, um zwischen den Ansichten in einer getrennten Weise zu kommunizieren. Oder Sie könnten einen serviceorientierten Ansatz verwenden. Zum Beispiel definiere ich normalerweise einen IApplication-Service, der dort steht, wo Sie normalerweise auf Application.Current in einem eng gekoppelten Design zugreifen würden. Sie könnten eine Eigenschaft für diesen Dienst bereitstellen, um den Inhalt der geladenen Datei zu speichern, und INotifyPropertyChanged für den Dienst verfügbar machen, damit das TranslationViewModel erkennen kann, dass die Eigenschaft geändert wurde.