如何将 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"/&gt; 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 上的属性?的主要内容,如果未能解决你的问题,请参考以下文章

WPF:将 DataGrid 放入 ComboBox

如何将 ObservableCollection 与 datagrid WPF 绑定

如何将 WPF DataGrid 绑定到 ObservableCollection

如何将 List<CustomObject> 绑定到 WPF DataGrid?

WPF DataGrid 如何将被选中行带到视野中

如何获取 WPF DataGrid 以将更改保存回数据库?