• 改变TreeView的ItemTemplate模板,选中子项的时候选中子项所在的TreeViewItem


      有时候我们为了方便使用TreeView,会改变它的ItemTemplate的模板,但是有时候,我们无法获取TreeView的SelectedItem,如下是在TreeViewItem添加一个多选框的模板,当我们单击CheckBox时,TreeView的SelectedItem就为null,即使界面选中一项,再改变其它项的值时,我们获得的SelectedItem也是界面选中的哪项,而不是我们改变值的那项,这不符合我们的要求,我希望当我改变任何一项的值时,获取的是改变值这项的TreeViewItem或者其相关联的数据项。

    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
              <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Id}"></TextBlock>
                    <CheckBox Margin="6,0,0,0" IsChecked="{Binding IsEnabled, UpdateSourceTrigger=PropertyChanged}" Focusable="False"
                 FlowDirection="RightToLeft" Content="是否启用"> </StackPanel> </HierarchicalDataTemplate> </TreeView.ItemTemplate>

      在这里我想的的方法是在鼠标按下之前,递归遍历TreeView的数据项,通过VisualTreeHelper获取数据项的在界面显示的范围,获取鼠标的位置,如果鼠标位置在数据项的显示范围内,则选中当前项,以下是我的代码实现

            public TreeViewItem SelectItemByClick(ItemsControl itemsControl)
            {
                foreach (object item in itemsControl.Items)
                {
                    var currentItem = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
                    //如果鼠标处于当前项内容边界框内
                    if (VisualTreeHelper.GetDescendantBounds(currentItem).Contains(Mouse.GetPosition(currentItem)))
                    {
                        //如果当前项展开则递归设置子项选中
                        if (currentItem.IsExpanded)
                        {
                            var selectedItem = SelectItemByClick(currentItem);
                            if (selectedItem != null)
                            {
                                selectedItem.IsSelected = true;
                                return selectedItem;
                            }
                        }
                        currentItem.IsSelected = true;
                        return currentItem;
                    }
                }
                return null;
            }

      最后,我们只需要在TreeView的PreviewMouseDown调用即可

            private void Tree_PreviewMouseDown(object sender, MouseButtonEventArgs e)
            {
                SelectItemByClick(orgTree);
            }

      至于为什么要在这个事件中做,大家可以查查按钮事件的触发顺序,这样可以在Click事件中获取当前改变值的项了。

     这样,我们的SelectedItem在单击CheckBox的时候也不为null了

  • 相关阅读:
    asp.net图片上传代码
    C#(同步调用、异步调用、异步回调)
    跨线程的控件调用
    C# ListView用法详解 很完整
    获取dataGridView双击时判断双击的是下面的行,还是列头
    加密解密类
    C# 中DataGridView 绑定List<T>做数据源的操作问题
    C#获取当前程序集的完整路径
    接口测试-小结
    接口测试用例
  • 原文地址:https://www.cnblogs.com/guanglin/p/3010992.html
Copyright © 2020-2023  润新知