TreeView SelectedItem возвращает тип - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть TreeView, который использует HierarchicalDataTemplate и модель представления в качестве контекста данных на разных узлах. Я хочу получить доступ к некоторым свойствам TreeViewItem из TreeView.SelectedItem - но это возвращает объект модели представления, а не TreeViewItem.
Как получить ссылку TreeViewItem на выбранный элемент?
(У меня такая же проблема в обработчиках SelectedItemChanged - отправитель объекта является моделью представления - как получить TreeViewItem?)
[Существует свойство TreeView SelectedContainer, которое возвращает TreeViewItem, но его недоступно :-(]

Это тип разочарования в ВПП, который заключается в том, что легко застрять на такого рода "деталях", и кажется, что должно быть простое / очевидное решение, но ...

Ответы [ 3 ]

1 голос
/ 28 февраля 2012

Как только вы привязали TreeView к контексту данных, вы всегда получите назад объекты модели представления.Если вы хотите манипулировать объектами TreeViewItem в ответ на события, вам нужно сделать это с помощью привязок.Например, свойства IsExpanded, IsSelected можно привязать к свойствам модели представления с помощью стилей.Следующий код автоматически выделяет выделенный элемент дерева и связывает вышеупомянутые свойства со свойствами модели представления, где я могу манипулировать ими / читать их.

        <TreeView x:Name="treeEquipment"
              ItemsSource="{Binding RootEquipment}" 
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <EventSetter Event="TreeViewItem.MouseRightButtonDown"
                             Handler="TreeViewItem_MouseRightButtonDown"/>
                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="FontWeight" Value="Normal" />
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="FontWeight" Value="Bold" />
                    </Trigger>
                </Style.Triggers>
            </Style> 
        </TreeView.ItemContainerStyle>
0 голосов
/ 28 февраля 2012

Другой подход заключается в обработке события TreeViewItem.Selected, которое, в отличие от TreeView.SelectedItemChanged (которое передает модель представления), действительно дает нам TreeViewItem через:

TreeViewItem item = e.OriginalSource as TreeViewItem;

Позволяет установить свойства, например,

TreeViewItem item = e.OriginalSource as TreeViewItem;
if (item != null) {
    item.Focus();
    item.IsSelected = false;
}
0 голосов
/ 28 февраля 2012

Свойство, которое я пытался установить, было IsSelected, и я всегда хотел иметь значение false, потому что сам управляю множественным выбором.Следуя советам StrayPointers, которые работают с привязкой в ​​режиме просмотра:

class TreeNodeViewMode {
    public bool no_selection {
        get { return false; }
        set { RaisePropertyChanged(); }
    }
}

XAML:

<TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="IsSelected" Value="{Binding no_selection, Mode=TwoWay}" />
    </Style>
</TreeView.ItemContainerStyle>
...