TreeView SelectedItem 返回类型

Posted

技术标签:

【中文标题】TreeView SelectedItem 返回类型【英文标题】:TreeView SelectedItem return type 【发布时间】:2012-03-17 21:11:26 【问题描述】:

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

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

【问题讨论】:

Getting TreeViewItem for the selected item in a TreeView in WPF 的可能重复项 【参考方案1】:

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

【讨论】:

感谢您的帮助。事实上,我试图禁用对树节点的选择(因为我自己管理多项选择)。所以绑定到总是返回 false 的视图模型属性是有效的。 致@Ricibob,您实际上是否最终使用了控件绑定的 SelectedItem 属性? (如果是,怎么做?我在同一条船上) @UB3571 不,我没有访问 SelectedItem 属性 - 但按照 StrayPointer 的建议进行操作,并将我需要的 TreeViewItem 字段“映射”到具有绑定的视图模型对象 - 然后通过视图模型对象访问它们。 【参考方案2】:

我试图设置的属性是 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>

【讨论】:

【参考方案3】:

另一种方法是处理 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;

【讨论】:

以上是关于TreeView SelectedItem 返回类型的主要内容,如果未能解决你的问题,请参考以下文章

有关TreeView.SelectedItem可绑定性的MSDN文档

WPF MVVM TreeView SelectedItem

Silverlight Treeview SelectedItem TwoWay 绑定导致混合错误

带有 TextBox 子项的 TreeView SelectedItem 行为

在应用了 HierarchicalDataTemplate 的 WPF TreeView 中绑定 SelectedItem

Treeview selectedItem 在启动时突出显示