【问题标题】:Bind to DataContext Property from within DataGridColumn从 DataGridColumn 绑定到 DataContext 属性
【发布时间】:2013-07-25 22:14:18
【问题描述】:

属性Foo在我的DataContext

ViewModel {
    Visibility Foo;
}


但我不知道如何在Column 中访问Foo。在这种情况下,我假设它可能在绑定到 DataGrid ItemsSource 的任何对象中寻找 Foo

<DataGrid Visibility="{Binding Foo}">                      // works
    <DataGrid.Columns>
        <DataGridTextColumn Visibility="{Binding Foo}" />   // fails


我试过了

Binding="{Binding DataContext.Foo}"

还有一堆带有RelativeSource 标签的东西。


另外,有什么方法可以从 GUI 中查看和选择要绑定的属性吗?

编辑:原来Columns本身不是FrameworkElements,所以无法定位DataGrid的祖先。但是,您可以使用下面答案中的技术将 Column 的 CellTemplate 的属性绑定到 DataContext。

【问题讨论】:

  • 您能否详细说明“选择要绑定的属性”是什么意思?或者至少想要的效果是什么?
  • 我想知道是否有一种方法可以从树视图中查看和选择项目,而不必记住如何编写所有 Path/RelativeSource/DataContext/etc 标记
  • 我同意您可以在 CellTemplate 上使用 Adi 答案中的 RelativeSource 绑定...如果您喜欢该解决方案,那么我认为您应该将其发布为解决方案并将其标记为答案,因为如果没有使用CellTemplate 的关键规定,Adi 的代码就无法工作。浏览此问题的人可能会合理地查看标记的“答案”并假设它可以在不阅读您的 cmets 的情况下正常工作。我添加了一种方法来绑定列的可见性,而不是使用 CellTemplate 隐藏单元格。

标签: .net wpf xaml binding datacontext


【解决方案1】:

我从这篇文章中发现了一些在可视化树之外进行绑定的方法: Artificial Inheritance Contexts in WPF

我正在使用第四个选项(与他的建议有关)。它相当hacky但很简单。它的缺点是 WPF 设计人员不喜欢它,并在设计时将错误放入错误日志中。为了获得环境DataContext,您可以使用x:Reference 标记扩展名(请参阅msdn)绑定到可视树中当前XAML 文件中的其他内容。这类似于ElementName 的绑定,只是它不依赖于InheritanceContext,您通常不会在可视树之外。如果UserControl 中没有其他内容可供参考,我只使用虚拟FrameWorkElement

我试图只引用包含的UserControl(或WindowPage 等),但这会导致循环引用异常,所以我使用虚拟元素,直到有人向我展示更好的方法。

<FrameworkElement Name="dummyElement" />
<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn 
           Visibility="{Binding Source={x:Reference dummyElement}, 
                                Path=DataContext.Foo}" 
        />

【讨论】:

    【解决方案2】:

    这应该可行:

    <DataGridTextColumn Visibility="{Binding Path=DataContext.Foo, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
    

    关于列绑定到当前项目的说法是正确的 - 这就是为什么您需要使用 RelativeSource 来获取 DataGrid,然后访问其 DataContext 中的 Foo 属性。

    至于选择要绑定的属性,WPF 设计器的属性面板和 Visual Studio 插件(例如 Resharper)可以提供帮助,但最终它们除了简单的绑定之外并没有做得那么好,所以你'剩下的是你自己和你对正在发生的事情的理解。

    【讨论】:

    • 见我上面的编辑。看起来技术是正确的,但是因为列不是 FrameworkElements,所以仍然失败。
    • 这似乎不像 OP 所指出的那样工作。那么为什么是答案呢?
    • x:reference 似乎是唯一的方法。 stackoverflow.com/questions/22073740/…
    猜你喜欢
    • 1970-01-01
    • 2014-03-24
    • 2021-10-24
    • 2013-03-30
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多