Получить выбранный TreeViewItem с помощью MVVM

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

Итак, мой общий вопрос: «Есть ли простой способ получить выбранный элемент в моей модели представления?»

16
задан Dave Clemmer 16 June 2013 в 00:52
поделиться