Quindi qualcuno ha suggerito di utilizzare un WPF TreeView
e ho pensato: "Sì, sembra l'approccio giusto". Ora, ore e ore dopo, semplicemente non riesco a credere a quanto sia stato difficile usare questo controllo. Attraverso una serie di ricerche, sono riuscito a far funzionare il controllo TreeView`, ma semplicemente non riesco a trovare il modo "corretto" per ottenere l'elemento selezionato nel modello di visualizzazione. Non ho bisogno di impostare l'elemento selezionato dal codice; Ho solo bisogno del mio modello di visualizzazione per sapere quale elemento l'utente ha selezionato.Ottieni AlberoViewView selezionato utilizzando MVVM
Finora, ho questo XAML, che non è molto intuitivo da solo. Questo è tutto all'interno del tag UserControl.Resources:
<CollectionViewSource x:Key="cvs" Source="{Binding ApplicationServers}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="DeploymentEnvironment"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<!-- Our leaf nodes (server names) -->
<DataTemplate x:Key="serverTemplate">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
<!-- Note: The Items path refers to the items in the CollectionViewSource group (our servers).
The Name path refers to the group name. -->
<HierarchicalDataTemplate x:Key="categoryTemplate"
ItemsSource="{Binding Path=Items}"
ItemTemplate="{StaticResource serverTemplate}">
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold"/>
</HierarchicalDataTemplate>
Ed ecco la vista ad albero:
<TreeView DockPanel.Dock="Bottom" ItemsSource="{Binding Source={StaticResource cvs}, Path=Groups}"
ItemTemplate="{StaticResource categoryTemplate}">
<Style TargetType="TreeViewItem">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected}"/>
</Style>
</TreeView>
Questa mostra correttamente i server per l'ambiente (dev, QA, prod). Tuttavia, ho trovato vari modi su SO per ottenere l'elemento selezionato, e molti sono contorti e difficili. C'è un modo semplice per ottenere l'elemento selezionato sul mio modello di visualizzazione?
Nota: esiste una proprietà SelectedItem
in TreeView`, ma è di sola lettura. Ciò che è frustrante per me è che la sola lettura va bene; Non voglio cambiarlo via codice. Ma non posso usarlo perché il compilatore si lamenta che è di sola lettura.
C'era anche un apparentemente elegante suggerimento per fare qualcosa di simile:
<ContentPresenter Content="{Binding ElementName=treeView1, Path=SelectedItem}" />
E ho fatto questa domanda:? "Come può il vostro un modello di vista ottenere queste informazioni ottengo che ContentPresenter
tiene l'elemento selezionato, ma come si arriva al modello di vista? " Ma non c'è ancora risposta.
Quindi, la mia domanda generale è: "C'è un modo semplice per ottenere l'elemento selezionato sul mio modello di visualizzazione?"
Ma il modello di vista non ha solo un legame con IsSelected? Come ottiene effettivamente il valore? –
E per valore, intendo il valore dell'elemento selezionato. Non sto cercando solo di sapere se qualcosa è selezionato, voglio sapere il valore dell'oggetto selezionato. –
Quindi, ho appena notato che hai scritto questo: "(il modello di visualizzazione per ogni oggetto nell'albero)." Non ho un modello di vista per ogni oggetto nell'albero. Ogni elemento nell'albero è un elemento in * un * elenco nel modello * one * view. –