【问题标题】:How do I retrieve the objects with which a WPF Treeview was populated?如何检索填充 WPF Treeview 的对象?
【发布时间】:2019-01-10 15:33:48
【问题描述】:

我有一个绑定到简单节点的树视图,每个节点都包含两个字符串(表达式、Exp2)和一个节点列表(子节点)。
我还这样做了,当双击特定的文本框时,它会引发一个事件,给我一个 TreeViewItem。

我如何从那里到达创建 TreeViewItem 的节点?

<TreeView x:Name="treeView" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="20,80,20,20">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:Node}"
                                  ItemsSource="{Binding Children}">
                <Grid>
                    <TextBlock Text="{Binding Expression}"/>
                    <!--<TextBlock Text="{Binding Exp2}"/>-->
                </Grid>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <EventSetter Event="MouseDoubleClick" Handler="TreeViewItem_MouseDoubleClick"/>
            </Style>
        </TreeView.ItemContainerStyle>

    </TreeView>


private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        if(sender is TreeViewItem)
        {
            if (!((TreeViewItem)sender).IsSelected)
            {
                return;
            }
            TreeViewItem item = (TreeViewItem)sender;
            //???
            //Profit
        }
    }

【问题讨论】:

  • 你指的是节点的Parent节点吗?
  • 您可以在 TreeViewItem 的 Tag 属性中存储对 Node 的引用,但是您可以直接访问 TreeViewItem.DataContext 吗?

标签: c# wpf binding treeview


【解决方案1】:

好的,这很复杂。

  1. 获取 TreeViewItem 的父项(作为 ItemsControl)

    var parent = ItemsControl.ItemsControlFromItemContainer(item);
    
  2. 然后使用父级的ItemContainerGenerator获取数据如下:

    var node = parent?.ItemContainerGenerator?.ItemFromContainer(item);
    

【讨论】:

  • 对于 WPF,这看起来并没有那么复杂。
  • 对我和你来说——也许不是,但对于很多需要这种帮助的人来说,很有可能
猜你喜欢
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2019-01-30
相关资源
最近更新 更多