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

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

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

【问题讨论】:

标签: wpf treeview selecteditem treeviewitem


【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 2010-11-17
      • 2010-12-15
      • 2012-11-30
      • 1970-01-01
      • 2017-09-07
      • 2011-09-12
      • 2015-05-15
      • 1970-01-01
      相关资源
      最近更新 更多