Wpf TreeView SelectedItem返回类型

Wpf TreeView SelectedItem返回类型,wpf,treeview,selecteditem,treeviewitem,Wpf,Treeview,Selecteditem,Treeviewitem,我有一个TreeView,它使用HierarchycalDataTemplate和视图模型作为不同节点上的数据上下文。我想从TreeView.SelectedItem访问一些TreeView项目属性,但这会返回一个视图模型对象,而不是TreeView项目。 如何获取选定项目的TreeViewItem引用? (SelectedItemChanged处理程序中也存在同样的问题-对象发送方是视图模型-如何获取TreeViewItem? [有一个TreeView属性SelectedContainer返回

我有一个TreeView,它使用HierarchycalDataTemplate和视图模型作为不同节点上的数据上下文。我想从TreeView.SelectedItem访问一些TreeView项目属性,但这会返回一个视图模型对象,而不是TreeView项目。
如何获取选定项目的TreeViewItem引用?
(SelectedItemChanged处理程序中也存在同样的问题-对象发送方是视图模型-如何获取TreeViewItem?
[有一个TreeView属性SelectedContainer返回一个TreeView项目,但它不可访问:-(]


世界粮食计划署令人沮丧的是,它很容易陷入这种“细节”中似乎必须有一个简单/明显的解决方案,但…

一旦将TreeView绑定到数据上下文,您将始终返回视图模型对象。如果您希望操作TreeView对象以响应事件,则需要通过绑定来完成。例如,IsExpanded、IsSelected属性可以绑定到view mod下面的代码自动加粗选定的树项目,并绑定上述属性以查看模型属性,我可以在其中操作/读取它们

        <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>

我试图设置的属性已被选中,我一直希望该属性为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>

另一种方法是处理TreeView.Selected事件,它不同于TreeView.SelectedItemChanged(它获取传入的视图模型),它通过以下方式获取TreeView.SelectedItem:

TreeViewItem item = e.OriginalSource as TreeViewItem;
这将启用属性设置,例如

TreeViewItem item = e.OriginalSource as TreeViewItem;
if (item != null) {
    item.Focus();
    item.IsSelected = false;
}

可能是重复的感谢。事实上,我正试图禁用树节点的选择(因为我自己管理多个选择)。因此绑定到总是返回false的视图模型属性是有效的。对于@Ricibob,您是否实际使用了控件绑定到的SelectedItem属性?(如果是,如何?我也在同一条船上)@UB3571否我没有访问SelectedItem属性,但按照StrayPointer的建议访问了该属性,并将所需的TreeViewItem字段“映射”到具有绑定的视图模型对象,然后通过视图模型对象访问它们。