Итак, кто-то предложил использовать 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
содержит выбранный элемент , но как это перенести на модель представления? " Но ответа пока нет.
Итак, мой общий вопрос: «Есть ли простой способ получить выбранный элемент в моей модели представления?»