Итак, кто-то предложил использовать WPF TreeView
, и я подумал: "Да, это похоже на правильный подход". Теперь, часа и часов спустя, я просто не могу поверить, насколько сложно было использовать этот контроль. Через кучу исследований я смог получить управление TreeView`, но я просто не могу найти "правильный" способ получить выбранный элемент в модель представления. Мне не нужно устанавливать выбранный элемент из кода; Мне просто нужна моя модель просмотра, чтобы узнать, какой элемент выбран пользователем.
До сих пор у меня есть этот XAML, который не очень интуитивен сам по себе. Все это находится в теге 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>
И вот дерево:
<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>
Это правильно показывает серверы по средам (dev, QA, prod). Тем не менее, я нашел различные способы SO, чтобы получить выбранный элемент, и многие из них сложны и сложны. Есть ли простой способ получить выбранный элемент в моей модели просмотра?
Примечание. В TreeView есть свойство SelectedItem
, но оно доступно только для чтения. Что меня расстраивает, так это то, что только чтение доступно; Я не хочу менять его с помощью кода. Но я не могу использовать его, потому что компилятор жалуется, что он доступен только для чтения.
Было также, казалось бы, элегантное предложение сделать что-то вроде этого:
<ContentPresenter Content="{Binding ElementName=treeView1, Path=SelectedItem}" />
И я задал этот вопрос: "Как может ваша модель представления получить эту информацию? Я понимаю, что ContentPresenter
содержит выбранный элемент, но как мы можем получить это для модели представления?" Но ответа пока нет.
Итак, мой общий вопрос: "Есть ли простой способ получить выбранный элемент в моей модели представления?"