【问题标题】:Using the parent's DataContext for Visibility property将父级的 DataContext 用于 Visibility 属性
【发布时间】:2012-02-09 21:25:05
【问题描述】:

我有一个绑定到 ViewModel 的 ObservableCollection 类型的属性的 DataGrid。在 DataGrid 内部,我有几个 DataGridTextColumns 绑定到 ObservableCollection 的项目。我需要访问父 DataContext (ViewModel) 来设置 DataGridTextColumns 之一的 Visibility 属性。 网上有一个解决方案:

{Binding DataContext.IsColumnVisible, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MyControl}}}

IsColumnVisible 属性属于 System.Windows.Visibility 类型。这种解决方案适用于 DataGridTextColumn.Binding 等其他属性,但不适用于 DataGridTextColumn.Visibility! 可见性有解决方案吗?

编辑:我终于采用了以下解决方案: Bind datagrid column visibility MVVM

【问题讨论】:

    标签: .net wpf xaml data-binding datagrid


    【解决方案1】:

    将列的Visibility 属性绑定到视图模型的属性。 见the following SA question

    另一件事是:使用BooleanToVisibilityConverter 类。你的视图模型暴露了与视图密切相关的类型 (Visibility) 的属性是不好的。这会在视图和视图模型之间引入应避免的耦合。

    公开一个bool,然后让视图使用转换器使其自身适应其视图模型。

    【讨论】:

      【解决方案2】:

      DataGrid 列是抽象对象,您不能使用ElementName(缺少namescope)或RelativeSource(不在可视化树中)来定位它们。

      另外 DataGrid 列没有DataContext...

      【讨论】:

      • 感谢您的解释!但是有没有太复杂的方法来实现我的目标?
      • @user835103:好吧,由于列没有 DataContext,您尝试定位的 DataContext 是什么?该项目的或DataGrid 的?
      • DataGrid 的。抱歉耽搁了,我无法访问我的 SA 帐户。
      • 谢谢。不幸的是,我不能使用 x:Reference,因为目标是 .NET Framework 3.5。我最终采用了以下解决方案:stackoverflow.com/questions/7711275/….
      【解决方案3】:

      您可以使用 BooleanToVisibilityConverter 将 Parent 的 Visibility 属性转换为布尔值。

      http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx

      【讨论】:

      • 这里不需要 BooleanToVisibilityConverter。 ViewModel.IsColumnVisible 和 DataGridTextColumn.Visibility 都是 System.Windows.Visibility 类型。实际上,为了简单起见,我暂时将 ViewModel.IsColumnVisible 类型从 bool 更改为 Visibility 以摆脱转换器。
      猜你喜欢
      • 2014-09-22
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      相关资源
      最近更新 更多