首页 > 解决方案 > 如何将树视图中的选定项目标记为选定项目(WPF)?

问题描述

我是 c# 和 wpf 的新手。我有一个treeview,我需要的是 - 当用户单击其中一个项目时,将此项目标记为选中。例如,当用户单击它标记为选中的行时,它在 DataGrid 中实现,用户可以轻松了解选中了哪一行。

我的 TreeView 实现是

<TreeView Name="Tv_request" 
                                  Grid.Row="1"
                                  HorizontalAlignment="Stretch"
                                  VerticalAlignment="Stretch"
                                  ItemsSource="{Binding Path=RequestSet}">
                            
                            <TreeView.ItemTemplate>
                                <HierarchicalDataTemplate 
                                    ItemsSource="{Binding Childrens}"
                                    DataType="{x:Type local:IRequest}">
                                    <TreeViewItem MouseUp="TreeViewItem_MouseUp" 
                                                  Header="{Binding TypePage}"/>
                                </HierarchicalDataTemplate>
                            </TreeView.ItemTemplate>
                            
                            <TreeView.ItemContainerStyle>
                                <Style TargetType="{x:Type TreeViewItem}">
                                    <Setter Property="IsExpanded" Value="True" />
                                </Style>
                            </TreeView.ItemContainerStyle>
                            
                        </TreeView>

我可以通过 TreeViewItem_MouseUp 事件获得点击项目的方式,但我需要实现标记选择项目。

如何实施?

编辑

为了获得点击的项目,我正在使用这种方法

private void TreeViewItem_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            var tree = sender as TreeViewItem;

            if (tree != null)
            {
                IRequest item = tree.DataContext as IRequest;
            
                Presenter?.TreeViewSelectedItem(item);
            }
        }

这样我就可以访问我选择的项目,但是如果我将其更改为

private void TreeViewItem_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            var tree = sender as ContentPresenter;

            if (tree != null)
            {
                IRequest item = tree.DataContext as IRequest;
            
                Presenter?.TreeViewSelectedItem(item);
            }
        }

所以,tree.DataContext返回我NodeType,逻辑上没问题,因为我设置了

<ContentPresenter Content="{Binding NodeType}"
                                                      MouseUp="TreeViewItem_MouseUp"/>

代替

<TreeViewItem MouseUp="TreeViewItem_MouseUp" 
                                                  Header="{Binding NodeType}"/>

所以,问题是,我怎样才能获得整个点击的对象而不仅仅是他的NodeType

标签: c#wpf

解决方案


首先,您的项目模板是在 TreeViewItem 内创建一个 TreeViewItem。它应该如下所示:

<HierarchicalDataTemplate 
    ItemsSource="{Binding Childrens}"
    DataType="{x:Type local:IRequest}">
    <ContentPresenter Content="{Binding TypePage}"/>
</HierarchicalDataTemplate>

TreeViewItem 将由 WPF 自动创建,并且HierarchicalDataTemplate您提供的内容将应用于它。

其次,TreeViewItem 有一个名为IsSelected. 您可以使用 Style 将此属性绑定到IRequest对象的属性:

<Style TargetType="{x:Type TreeViewItem}">
  <Setter Property="IsExpanded" Value="True" />
  <Setter Property="IsSelected" Value="{Binding RequestIsSelected}" />
</Style>

或者,如果您愿意,可以使用 anEventSetterTreeViewItem.Selected事件提供处理程序:

<Style TargetType="{x:Type TreeViewItem}">
  <Setter Property="IsExpanded" Value="True" />
  <EventSetter RoutedEvent="Selected" Value="TreeViewItem_Selected" />
</Style>

您也可以使用该TreeView.SelectionChanged事件而不是处理单个树视图项目,但请注意您(令人讨厌!)无法从 TreeView 本身中选择新项目。


推荐阅读