博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DataGridTemplateColumn 如何获取内部控件
阅读量:5078 次
发布时间:2019-06-12

本文共 3840 字,大约阅读时间需要 12 分钟。

WPF中有时候我们不使用DataGridTextColumn 而使用用途更加宽广的DataGridTemplateColumn 

但是用途多的东西当然也更复杂。

这里说下如何取DataGridTempateColumn得内部控件

一般可以用以下代码:

private void DataGrid_MouseRightButtonUp(object sender,                                                  MouseButtonEventArgs e){
DependencyObject dep = (DependencyObject)e.OriginalSource; // iteratively traverse the visual tree while ((dep != null) !(dep is DataGridCell) !(dep is DataGridColumnHeader)) {
dep = VisualTreeHelper.GetParent(dep); } if (dep == null) return; if (dep is DataGridColumnHeader) {
DataGridColumnHeader columnHeader = dep as DataGridColumnHeader; // do something } if (dep is DataGridCell) {
DataGridCell cell = dep as DataGridCell; // do something }}

以上代码使用 VisualTreeHelper 检索 DependencyObject的 Parent

我们也可以反过来做:

VisualTreeHelper 有 GetChildrenCount() GetChild(..) 这两个函数获取内部的孩子。

但是很遗憾 DataGridTemplateColumn 不会存在于VisualTree中,(查询会有错误,说对象不是 Visual 也不是Visual3D)

也不存在与LogicalTree中,你可以尝试GetParent或者GetChild分别是Null和一个空的IEnumrable 

相关内容:
http://stackoverflow.com/questions/2375237/wpf-system-argumentexception-0-is-not-a-visual-or-visual3d

实际上DataGridTemplateColumn  内部没有你想要的东西,你应当从 DataGridTemplateColumn 所属元素的上层去取,查看以下代码:

void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)        {            if (sender.IsNull() || !(sender is DataGrid))                return;            //var cell = GetCell(dataGrid, 0, 14);            //var ttt = WPFItem.GetWPFItem(cell);            if ( e.IsNotNull() && e.Device.IsNotNull() && e.Device.Target.IsNotNull() && e.Device.Target is DataGridColumnHeader)            {                var columnHelper = ((DataGridColumnHeader)e.Device.Target);                var column = columnHelper.Column;                                                      }                           }

  在实际使用中, columnHelper.Column 可能是普通的 DataGridTextColumn, 也可能是复杂的 DataGridTemplateColumn , 

我们应当从 columnHelper入手 , 使用 VisualTreeHelper.GetChildrenCount() GetChild() 这两个函数就能取到 DataGridTemplateColumn 内部的数据了。

当然你不可能在 columnHelper的 children 中发现DataGridTemplateColumn, 他不存在与VisualTree中。

http://stackoverflow.com/questions/2375237/wpf-system-argumentexception-0-is-not-a-visual-or-visual3d

一个人是这么说的:

When you look at the  you can see that the VisualTreeHelper expects a UIElement, but a data grid column is only a dependency object, not a visual element.

连接:

相关VisualTree , LogicalTree的资料:

最后贴一个枚举一个WPF元素的解析类

class WPFItem    {        public DependencyObject dpObject;        public WPFItem[] Children;        public static WPFItem GetWPFItem(DependencyObject arg_dpobject)        {            var item = new WPFItem();            item.dpObject = arg_dpobject;                       var nChildCount = VisualTreeHelper.GetChildrenCount(arg_dpobject);            item.Children = new WPFItem[nChildCount];            for (var i = 0; i < nChildCount; i++)            {                item.Children[i] = GetWPFItem(VisualTreeHelper.GetChild(arg_dpobject, i));            }            return item;        }        public override string ToString()        {            return string.Format("{0},[{1}]", dpObject.ToString2(), Children.IsEmpty() ? "0" : Children.Length.ToString());        }    }

最后顺便说一句,DataGridTemplateColumn 要想和DataGridTextColumn排序,请这么做:

SortMemberPath="ImpRepo"
要加上SortMemberPath就能排序了

http://stackoverflow.com/questions/2375237/wpf-system-argumentexception-0-is-not-a-visual-or-visual3d

转载于:https://www.cnblogs.com/norsd/p/6359381.html

你可能感兴趣的文章
WPF/MVVM 快速开始指南(译)(转)
查看>>
Angular1.0路由的Hashbang和HTML5模式
查看>>
uboot配置过程详解1
查看>>
ajax复选框的选中添加
查看>>
万门大学-人工智能、大数据与复杂系统-01.复杂系统
查看>>
《机器学习基石》---线性回归
查看>>
js实现滑动返回顶部
查看>>
BZOJ 1208 [HNOI2004]宠物收养所:Splay(伸展树)
查看>>
vm setup灰色解决办法
查看>>
机器学习基石笔记14——机器可以怎样学得更好(2)
查看>>
jquery radio,checkbox,select相关【转】
查看>>
Software--Spring Boot--Contact 项目初期
查看>>
什么是位、字节、字、KB、MB?
查看>>
.net 将excel与SQL数据交换
查看>>
hdu 2680(最短路)
查看>>
SpringMVC中的ResponseBody和RequestBody介绍
查看>>
实验四 内存的分配与回收
查看>>
编译Boost
查看>>
深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
查看>>
tar exclude用法
查看>>