【问题标题】:How do I bind a WPF DataGrid DataColumns visibility to a property on the UserControl's ViewModel?如何将 WPF DataGrid DataColumns 可见性绑定到 UserControl 的 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(因为它在我的属性定义的视图模型中)

标签: .net wpf xaml mvvm


【解决方案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>

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 2010-12-01
    • 2011-06-22
    • 1970-01-01
    • 2010-11-23
    • 2017-07-25
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多