如何通过绑定隐藏WPF DataGrid
中的列?
这就是我做的:
<DataGridTextColumn Header="Column header"
Binding="{Binding ColumnValue}"
Width="100"
ElementStyle="{StaticResource DataGridRightAlign}"
Visibility="{Binding MyColumnVisibility}" />
这就是我得到的(除了列仍然可见):
System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement . BindingExpression:路径= MyColumnVisibility;的DataItem = NULL; target元素是'DataGridTextColumn'(HashCode = 1460142);目标属性是“可见性”(类型“可见性”)
不知道什么是治理手段 . 在我窗口的某个地方是否有一些总统先生决定哪些有效,哪些无效?或者我必须投票?
在网上搜索解决方案时,我发现有十几页具有很好的 Headers ,但完全不相关或不可复制的内容 . 所以这似乎是关于这个问题的第一个问题 . 任何的想法?
2 回答
首先 DataGridTextColumn or any other supported dataGrid columns doesn't lie in Visual tree of DataGrid . 因此,默认情况下 it doesn't inherit DataContext of DataGrid . 但是,它仅适用于
Binding
DP,而不适用于DataGridColumn上的其他DP .因为,它们不在同一个VisualTree中,因此任何尝试使用
RelativeSource
获取DataContext都能够遍历到DataGrid .有两种方法可以实现这一点:
First 使用
Freezable
class - Freezable 对象可以继承DataContext,即使它们不在可视树或逻辑树中 . 所以,我们可以利用它来使用它 .首先创建继承自
Freezable
和Data
DP的类,我们可以使用它来绑定XAML:现在,在DataGrid资源中添加它的一个实例,以便它可以继承DataGrid的DataContext,然后可以与其Data DP绑定:
Second ,您可以使用
ElementName
或x:Reference
引用XAML中的任何UI元素 . 但是ElementName
只能在同一个可视树中工作,而x:Reference没有这样的约束 .所以,我们也可以利用它 . 在可见性设置为折叠的XAML中创建虚拟
FrameworkElement
. FrameworkElement将从其父容器继承DataContext,该容器可以是Window或UserControl .并且可以在DataGrid中使用它:
视图模型中绑定属性的示例: