如何添加WPF树视图节点单击事件获取节点值

本文关键字:节点 视图 单击 事件 获取 WPF 何添加 添加 | 更新日期: 2023-09-27 18:14:19

我在wpf中有一个TreeView,如何获得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";

如何添加WPF树视图节点单击事件获取节点值

由于没有可用于TreeViewItem或TreeView的点击事件,因此这里有可能的解决方法

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

在这两种方法中,发送方都是被单击的节点。你可以使用as

例子
    void treeItem_Selected(object sender, RoutedEventArgs e)
    {
        TreeViewItem item = sender as TreeViewItem;
        //you can access item properties eg item.Header etc. 
        //your logic here 
    }

如果你需要采用更MVVM友好的方法,你可以在你的TreeView ItemTemplate上使用一个交互触发器,并将命令与TreeView项目对象的参数绑定回你的父视图:

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

如果在树视图中添加了上下文菜单,则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>