如何将 WPF DataGrid DataColumns 可见性绑定到 UserControl 的 ViewModel 上的属性?
Posted
技术标签:
【中文标题】如何将 WPF DataGrid DataColumns 可见性绑定到 UserControl 的 ViewModel 上的属性?【英文标题】:How do I bind a WPF DataGrid DataColumns visibility to a property on the UserControl's ViewModel? 【发布时间】:2017-11-01 18:07:52 【问题描述】:我有一个包含在 UserControl 中的 WPF DataGrid。
在用户控件的 ViewModel 中,我定义了以下内容:
private Visibility _ColumnVisibility;
public Visibility ColumnVisibility
get return _ColumnVisibility;
set this._ColumnVisibility= value;
OnNotifyPropertyChanged("ColumnVisibility");
我在 XAML 中的列定义如下所示:
<DataGrid.Columns>
<DataGridTextColumn Binding="Binding UserCode"
Header="UserCode"
Visibility="Binding RelativeSource=RelativeSource AncestorType=UserControl,Path=ColumnVisibility"/>
</DataGrid.Columns>
我在运行时遇到以下异常:
System.Windows.Data 错误:4:找不到绑定源 参考'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', 祖先级别='1''。绑定表达式:路径=列可见性; 数据项=空;目标元素是“DataGridTextColumn” (哈希码=21737301);目标属性是“可见性”(类型 '可见性')
将 DataGrid 列可见性绑定到包含 UserControl 的 ViewModel 中定义的属性的最佳(最简单)方法是什么?
【问题讨论】:
当你想绑定到用户控件视图模型中的一个属性时,为什么要RelativeSource
?
Dr.Fre:那么正确的绑定方式应该是……?
你试过了吗? Visibility="Binding Path=DataContext.ColumnVisibility, RelativeSource=RelativeSource AncestorType=DataGrid"/>
EP:在我的情况下,我的祖先不是 UserControl(因为它在我的属性定义的视图模型中)
【参考方案1】:
我在这里找到了 AnjumSKhan 在 SO 中的优雅解决方案: How to hide wpf datagrid columns depending on a property
<!--
AnjumSKhan: I would prefer a more elegant approach which involves using a Freezable.
-->
<Window.Resources>
<DiscreteObjectKeyFrame x:Key="FlagKey" Value="Binding Flag"/>
</Window.Resources>
【讨论】:
以上是关于如何将 WPF DataGrid DataColumns 可见性绑定到 UserControl 的 ViewModel 上的属性?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 ObservableCollection 与 datagrid WPF 绑定
如何将 WPF DataGrid 绑定到 ObservableCollection