改变TreeView的ItemTemplate模板,选中子项的时候选中子项所在的TreeViewItem
2013-04-09 20:51
232 查看
有时候我们为了方便使用TreeView,会改变它的ItemTemplate的模板,但是有时候,我们无法获取TreeView的SelectedItem,如下是在TreeViewItem添加一个多选框的模板,当我们单击CheckBox时,TreeView的SelectedItem就为null,即使界面选中一项,再改变其它项的值时,我们获得的SelectedItem也是界面选中的哪项,而不是我们改变值的那项,这不符合我们的要求,我希望当我改变任何一项的值时,获取的是改变值这项的TreeViewItem或者其相关联的数据项。
在这里我想的的方法是在鼠标按下之前,递归遍历TreeView的数据项,通过VisualTreeHelper获取数据项的在界面显示的范围,获取鼠标的位置,如果鼠标位置在数据项的显示范围内,则选中当前项,以下是我的代码实现
最后,我们只需要在TreeView的PreviewMouseDown调用即可
至于为什么要在这个事件中做,大家可以查查按钮事件的触发顺序,这样可以在Click事件中获取当前改变值的项了。
这样,我们的SelectedItem在单击CheckBox的时候也不为null了
<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了
相关文章推荐
- 提醒模板Template.xml中的超链接如何根据AffairDetail和ItemDetail相应改变?
- Qt TreeView中的排序问题和改变选中的item后更新出错的问题
- ListView 点击Item的时候,改变文字颜色和背景色
- WPF中TreeView控件如何获取选中的TreeViewItem对象?
- 【Android笔记】listview点击或选中item改变item样式或背景
- Template、ItemsPanel、ItemContainerStyle、ItemTemplate(包括ListBox的Item子项是横向排列)
- ListView的item为TextView的时候,选中item设置不同的背景
- treeview checkbox选中的时候选择子节点 mvvm
- c# 中treeview 树节点图标的动态加载,及选中时图标改变
- ListView点击item改变背景,重新选中另一项刷新,默认是选中第一项的状态
- treeview 如何改变选中节点的背景。
- listView点击选中时候,item不变色
- 如何改变treeview控件选中节点的高亮颜色,就是大家都熟悉的深蓝色,同样可以改变失去焦点时,高亮显示的颜色
- gallery中的子项在点击的时候改变子项的背景图片
- c# 中treeview 树节点图标的动态加载,及选中时图标改变
- 改变选中的ListView Item数据颜色直到选中下一个
- 选中ListBoxItem中的TextBox后,如何改变ListBox的SelectedItem?
- GrideView点击某个item实现选中效果,改变item的背景颜色
- wpf的treeview显示item时候不能stretch的一个解决办法
- ComboBox SelectionChanged改变SelectedItem MenuItem通过什么方法获得子元素选中项,已解决!