控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

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

作者:未知 出处:cnblog 2013年04月10日 阅读:

 有时候我们为了方便使用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了

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统