Ktoś zasugerował użycie WPF TreeView
i pomyślałem: "Tak, to wygląda na właściwe podejście." Teraz, kilka godzin później, po prostu nie mogę uwierzyć, jak trudno było użyć tej kontroli. Dzięki kilku badaniom udało mi się sprawić, że kontrolka TreeView działa, ale po prostu nie mogę znaleźć "właściwego" sposobu na przeniesienie wybranego elementu do modelu widoku. Nie muszę ustawiać wybranego elementu z kodu; Potrzebuję tylko mojego modelu widoku, aby wiedzieć, który element został wybrany przez użytkownika.Pobierz wybrane drzewoViewItem przy użyciu MVVM
Do tej pory mam ten XAML, który nie jest bardzo intuicyjny sam w sobie. To wszystko w tagu 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>
A oto katalogów:
<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>
to poprawnie pokazuje serwerów przez środowiska (dev, QA, prod). Jednak znalazłem różne sposoby, aby uzyskać wybrany element, a wiele z nich jest zawiłych i trudnych. Czy istnieje prosty sposób, aby uzyskać wybrany element do mojego modelu widoku? prosty
Uwaga: istnieje właściwość SelectedItem
w TreeView`, ale jest ona tylko do odczytu. Frustruje mnie to, że tylko do odczytu jest w porządku; Nie chcę tego zmieniać za pomocą kodu. Ale nie mogę go użyć, ponieważ kompilator narzeka, że jest tylko do odczytu.
Był też pozornie elegancki sugestia zrobić coś takiego:
<ContentPresenter Content="{Binding ElementName=treeView1, Path=SelectedItem}" />
I zadał to pytanie: „Jak twój model widok może uzyskać te informacje uzyskać że ContentPresenter
posiada wybrany element, ale w jaki sposób przekazujemy to do modelu widoku? " Ale nie ma jeszcze odpowiedzi.
Moje ogólne pytanie brzmi: "Czy jest jakiś prosty sposób, aby uzyskać wybrany element do mojego modelu widoku?"
Ale czy model widoku nie ma powiązania z IsSelected? W jaki sposób otrzymuje wartość? –
I według wartości, mam na myśli wartość wybranego elementu. Nie chcę tylko wiedzieć, czy coś jest wybrane, chcę poznać wartość wybranego przedmiotu. –
Po prostu zauważyłem, że napisałeś to: "(model widoku dla każdego elementu w drzewie)." Nie mam modelu widoku dla każdego elementu w drzewie. Każda pozycja w drzewie jest pozycją na liście * jeden * w modelu * jeden * widok. –