如何通过绑定隐藏WPF DataGrid
中的列?
我是这么做的:
<DataGridTextColumn Header="Column header"
Binding="{Binding ColumnValue}"
Width="100"
ElementStyle="{StaticResource DataGridRightAlign}"
Visibility="{Binding MyColumnVisibility}" />
这是我得到的(除了列仍然可见):
系统窗口数据错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。绑定表达式:路径= MyColumnVisibility;数据项=空;目标元素为"数据网格文本列"(哈希代码= 1460142);目标属性为"可见性"(类型为"可见性")
如何固定装订?
4条答案
按热度按时间jv4diomz1#
首先,**
DataGridTextColumn
(或任何其他受支持的dataGrid列)不位于DataGrid
**的Visual树中。因此,默认情况下,**它不继承DataGrid
**的DataContext
。但是,它仅适用于Binding
DP,不适用于DataGridColumn上的其他DP。因为它们不在同一个VisualTree中,所以任何使用
RelativeSource
获取DataContext
的尝试都不会成功,因为DataGridTextColumn
无法遍历到DataGrid
。不过,还有另外两种方法可以实现这一点:
首先使用
Freezable
类。**Freezable
**对象可以继承DataContext,即使它们不在可视或逻辑树中-我们可以利用这一点。首先,创建一个继承自
Freezable
和Data
DP的类,我们可以使用它在XAML中进行绑定:现在,在DataGrid资源中添加它的一个示例,以便它可以继承DataGrid的DataContext并与其Data DP绑定:
其次,您可以使用
ElementName
或x:Reference
引用XAML中的任何UI元素。但是,ElementName
只能在同一个可视化树中工作,而x:Reference没有这样的约束。因此,我们也可以利用它。在XAML中创建一个虚拟的
FrameworkElement
,将Visibility设置为collapsed
。FrameworkElement将从其父容器继承DataContext,该容器可以是Window或UserControl。并且可以在DataGrid中使用它:
q3aa05252#
视图模型中绑定属性示例:
p8h8hvxi3#
我喜欢的另一个简单的解决方案是在与
DataGrid
相同的级别上添加一个虚拟的折叠FrameworkElement
,然后可以使用FrameworkElement
作为带有x:Reference
标记扩展的Binding
的Source
。比如这样一个例子:
z9smfwbn4#
如果您在XAML中创建了Window/Page/UserControl DataContext对象,另一个快速选项如下所示:
您可以使用绑定Source中DataContext对象的x:Name添加x:Reference:
这样,您就可以避免使用绑定DataContext.MyColumnVisibility,而只使用绑定MyColumnVisibility