WPF --- 如何以Binding方式隐藏DataGrid列
内容提要
本文介绍了如何以Binding的方式动态隐藏DataGrid列。作者首先创建了数据源People和控制列隐藏的IsVisibility,并使用VisibilityConverter将布尔值转化为Visibility。然后在界面中绑定IsVisibility,并使用转化器转化为Visibility,最后增加一个CheckBox控制是否显示列。作者发现直接找DataContext的方式无法生效,因为DataGridColumn不在可视化树中。为了解决这个问题,作者借助了System.Windows.Freezable抽象类,创建了一个自定义Freezable类,实现了预期功能。最后作者欢迎读者留言讨论更优雅的方案。
关键要点
-
本文介绍了如何以Binding的方式动态隐藏DataGrid列。
-
创建数据源People和控制列隐藏的IsVisibility,并使用VisibilityConverter将布尔值转化为Visibility。
-
在界面中绑定IsVisibility,并使用转化器转化为Visibility,增加CheckBox控制是否显示列。
-
直接找DataContext的方式无法生效,因为DataGridColumn不在可视化树中。
-
DataGridColumn不继承Visual,而是直接继承DependencyObject,因此不在可视化树中。
-
通过创建自定义Freezable类来解决无法找到DataContext的问题。
-
自定义Freezable类能够承载依赖属性并提供属性变化通知。
-
在XAML中添加customFreezable资源,给DataGridTextColumn的Visibility绑定资源。
-
测试结果显示,勾选后能够显示年龄列,取消勾选后能够隐藏年龄列。
-
总结了DataGridTextColumn不在可视化树的原因及通过曲线救国实现Binding隐藏列的方法。