4

财产Foo在我的DataContext

ViewModel {
    Visibility Foo;
}


但我不知道如何FooColumn. 在这种情况下,我认为它可能正在寻找Foo绑定到DataGrid ItemsSource

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


我努力了

Binding="{Binding DataContext.Foo}"

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


此外,是否有某种方法可以从 GUI 中查看和选择要绑定的属性?

编辑:事实证明,列本身不是 FrameworkElements,因此它们无法找到 DataGrid 祖先。但是,您可以使用下面答案中的技术将列的 CellTemplate 的属性绑定到 DataContext。

4

2 回答 2

4

这应该有效:

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

您对绑定到当前项目的列是正确的 - 这就是为什么您需要使用RelativeSource来获取 DataGrid,然后访问FooDataContext.

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

于 2013-07-25T20:27:10.217 回答
4

我从这篇文章中找到了一些在可视化树之外进行绑定的方法: WPF 中的人工继承上下文

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

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

<FrameworkElement Name="dummyElement" />
<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn 
           Visibility="{Binding Source={x:Reference dummyElement}, 
                                Path=DataContext.Foo}" 
        />
于 2013-11-20T22:31:01.743 回答