Тип возвращаемого значения TreeView SelectedItem

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

В WFP очень неприятно то, что легко застрять на таких «деталях», и кажется, что должно быть простое / очевидное решение, но ...


person Ricibob    schedule 28.02.2012    source источник
comment
возможный дубликат Получение TreeViewItem для выбранного элемента в TreeView в WPF   -  person H.B.    schedule 28.02.2012


Ответы (3)


После того, как вы привязали свой 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>
person StrayPointer    schedule 28.02.2012
comment
Спасибо, что помогло. Фактически я пытался отключить выбор узла дерева (потому что я сам управляю множественным выбором). Таким образом, привязка к свойству модели представления, которое всегда возвращало false, работала. - person Ricibob; 28.02.2012
comment
Что касается @Ricibob, вы действительно использовали свойство SelectedItem, к которому был привязан ваш элемент управления? (Если да, то как? Я в одной лодке) - person Rachael; 11.03.2013
comment
@ UB3571 Нет. Я не обращался к свойству SelectedItem, но сделал, как предложил StrayPointer, и сопоставил поля TreeViewItem, которые мне нужны, с моим объектом модели представления с привязками, а затем обратился к ним через объект модели представления. - person Ricibob; 13.03.2013

Свойство, которое я пытался установить, было 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>
person Ricibob    schedule 28.02.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;
}
person Ricibob    schedule 28.02.2012