如何添加WPF treeView节点点击事件以获取节点值

6

我在wpf中有一个TreeView,如何获取节点点击事件,以便我可以获取用户所点击的节点上的值?

Xaml

<Grid Height="258" Width="275">
    <TreeView Height="258" HorizontalAlignment="Left" Name="treeView1" VerticalAlignment="Top" Width="275">    
    </TreeView>
</Grid>

我已经通过C#代码填充了这个TreeView。我需要在C#代码中编写哪个事件方法来获取用户在我的C#代码中单击的节点的值。

用于加载的后台代码

TreeViewItem treeItem = null;
treeItem = new TreeViewItem();
treeItem.Header = "Name";

C#代码在哪里?你需要点击节点还是选择节点?通常情况下,单击一个节点也会将其选中。 - pushpraj
@pushpraj 其实,C#代码很长。因此,我只发布了我添加到应用程序的Window_loaded中的小片段。 - user3816352
好的,先生。我需要被点击的那一个。 - user3816352
@pushpraj 先生,字符串头部应该是 item.Header; 这样正确吗? - user3816352
3个回答

7

由于TreeViewItem或TreeView中没有可用的Click事件,因此这里提供了可能的解决方法

从C#代码中您有两个选项:

使用MouseLeftButtonUp,每次释放鼠标左键时都会触发该事件,类似于点击

    void preparemethod()
    {
        ...
        TreeViewItem treeItem = null;
        treeItem = new TreeViewItem();
        treeItem.Header = "Name";
        treeItem.MouseLeftButtonUp += treeItem_MouseLeftButtonUp;
    }

    void treeItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        //your logic here
    }

如果选择“Selected”作为触发器,可能不会在单击所选元素时触发

    void preparemethod()
    {
        ...
        TreeViewItem treeItem = null;
        treeItem = new TreeViewItem();
        treeItem.Header = "Name";
        treeItem.Selected += treeItem_Selected;
    }

    void treeItem_Selected(object sender, RoutedEventArgs e)
    {
        //your logic here
    }

在这两种方法中,发送者是被点击的节点。你可以使用以下示例:
    void treeItem_Selected(object sender, RoutedEventArgs e)
    {
        TreeViewItem item = sender as TreeViewItem;
        //you can access item properties eg item.Header etc. 
        //your logic here 
    }

在将发送者转换为TreeViewItem之后,您可以访问项属性,例如item.Header等,请参见更新的答案。 - pushpraj
1
如果我没错的话,TreeViewItem item = sender as TreeViewItem; 中的项就是被选中的 TreeViewItem。如果不是,请澄清一下你所说的项是什么意思? - pushpraj
1
我有些迷失了,item是被点击的节点,item.Header是节点文本中所见的文本,而item.Items是它的子项。如果这些值都不是你感兴趣的值,那么还有什么其他的值呢?你在哪里设置这个值? - pushpraj
1
item.Items 是一个对象集合,其中包含子项,因此您可以将其用作 TreeViewItem 的子项,例如:TreeViewItem child1 = item.Items[0] as TreeViewItem; 或者您可以在 foreach 循环中访问 item.Items。foreach(TreeViewItem child in item.Items) { //在此处添加您的逻辑} - pushpraj
请查看我的新帖子,先生:http://stackoverflow.com/questions/24885241/getting-the-value-of-the-child-nodes-on-click-event-in-wpf-treeview - user3816352
显示剩余10条评论

1
如果您需要采用更符合MVVM的方法,请在您的TreeView ItemTemplate上使用一个交互触发器,并将命令绑定到树形视图项对象的参数,以返回给父ViewModel。
<TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding SubItems}">

                    <TextBlock Text="{Binding Header, Mode=OneWay}" >
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="MouseLeftButtonUp">
                            <i:InvokeCommandAction Command="{Binding DataContext.SelectedTreeViewItemClickedCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"  CommandParameter="{Binding ElementName=trvMainMenu,Path=SelectedItem}"/>
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                    </TextBlock>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>

0

如果有人已经将上下文菜单添加到了树形视图中,那么 onclick 事件仅会返回菜单项,而不是视觉树本身。

获取实际的树形视图项的更好方法是执行以下步骤:

  1. 为发生操作的 TreeView 命名,例如此示例中使用 tView
  2. 在菜单(或任何其他事件)的单击事件中获取当前选定的项:var node = tView.SelectedItem as TreeViewItem

如果当前没有选定的项,请告诉用户选择该项并重新进行该过程。一旦选择,此时您就拥有了实际的树形视图项,可以对其进行处理并完成所需操作。


<TreeView x:Name="tView"
            HorizontalAlignment="Stretch" >
    <TreeView.ContextMenu>
        <ContextMenu>
            <MenuItem Click="CopyChildrenToClipboard"
                      Header="Copy Children To Clipboard">
                <MenuItem.Icon>
                    <Image Source="assets/check_green.png"
                           Height="16" />
                </MenuItem.Icon>
            </MenuItem>
        </ContextMenu>
    </TreeView.ContextMenu>
</TreeView>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接