Ich habe ein ViewModel über einem WPF-TreeView-Steuerelement. Ich möchte, dass das ViewModel das SelectedItem aus der TreeView setzen und lesen kann. Die SelectedItem-Eigenschaft der TreeView ist jedoch nicht bindbar.
Ich bin in der Lage, das ausgewählte Element im Code zu setzen und zu erhalten (mit ItemContainerGenerator und TreeViewItem.IsSelected = true), aber das führt zu einer hässlichen Kommunikation zwischen dem Code dahinter und dem ViewModel.
Hat jemand dafür eine saubere Lösung?
Ich kann ein Beispiel geben.
Was ich mache, ist die IsSelected
-Eigenschaft von TreeViewItem
(nicht die TreeView
selbst) im View-Modell zu setzen, weil Sie daran binden können.
In meinem View-Modell habe ich eine Eigenschaft ElementInViewModel
, die eine Datenstruktur ist, die selbst einen Baum bildet.
Ich verwende ein HierarchicalDataTemplate
in meinem Xaml, um es anzuzeigen.
Das Datenobjekt selbst hat den Typ YourDomainType
und seine untergeordneten Elemente (des gleichen Typs) befinden sich in der Eigenschaft ChildElements
.
Im Ansichtsmodell habe ich die Eigenschaft IsExpanded
und IsSelected
meiner Datenklasse YourDomainType
festgelegt. Aufgrund des unten definierten Stils übergeben sie diese Einstellung an TreeViewItem
.
Funktioniert das für Sie?
%Vor%Sie können eine Art Proxy-Klasse verwenden, um die SelectedItem-Eigenschaft an die In-Eigenschaft und die Out-Eigenschaft an Ihr ViewModel zu binden:
%Vor%Tags und Links wpf treeview viewmodel selecteditem