Fangen wir mal mit der ViewModel-Ebene an: In einem zentralen VM (ob MainVM oder NavigationBarVM oder vielleicht sogar beide doch lieber in einer Klasse ist eher Geschmackssache) bräuchten wir erst einmal das VM, das dann rechts angezeigt werden soll:
Code:
public ContentViewModel SelectedContent { get; set; }
Dabei habe ich zur Übersicht eine Basisklasse für alle entsprechenden VMs eingeführt, auch wenn sie wahrscheinlich gar keinen Code enthalten wird.
Diese Property können wir sofort binden:
Code:
<ContentPresenter Content="{Binding SelectedContent}" />
Da aber ein DataTemplate kaum für alle ContentVMs passen wird, geben wir es nicht explizit an, sondern benutzen Implicit Data Templates:
Code:
<DataTemplate DataType="{x:Type vm:SomeContentViewModel}">
<view:SomeContentView />
</DataTemplate>
Das muss entweder in die Ressourcen der gleichen XAML-Datei oder in App.xaml. Einfache Templates könntest du auch direkt darin deklarieren, aber der Übersichtlichkeit halber sind UserControls sicher keine schlechte Idee
.
TreeView+MVVM ist grundsätzlich klar? Kurz skizziert braucht jedes VM eines TreeViewItems eine Eigenschaft
Code:
ContentViewModel Content { get; private set; }
Dann kannst du die beiden verbinden:
Code:
<TreeView SelectedValue="{Binding SelectedContent}" SelectedValuePath="Content" />
Edit: WTF, warum ist das
XML-Code-Tag inline
?
Das muss ich wohl mal nachlesen. Erledigt, ich bleib wohl erstmal bei den schmucklosen Dingern
.