使用RelativeSource和AncestorType进行WPF数据绑定

时间:2010-11-24 09:47:37

标签: c# .net wpf vb.net xaml

我正在尝试使用一些绑定代码。基本上我想将网格上下文菜单元素的IsEnabled属性与网格中选定行的值绑定。

我有这个工作:

            <my:DataGrid.ContextMenu>
                <ContextMenu DataContext="{Binding PlacementTarget.SelectedItem, RelativeSource={RelativeSource Self}}"> 
                    <MenuItem Header="Grant Access" IsEnabled="{Binding Connectable}"/>
                </ContextMenu>
            </my:DataGrid.ContextMenu>

但是我想这样做,而且它不起作用。它没有错误,但只是不禁用菜单项。知道为什么吗?

            <my:DataGrid.ContextMenu>
                <ContextMenu> 
                    <MenuItem Header="Grant Access" IsEnabled="{Binding Path=SelectedItem.Connectable, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type my:DataGrid}}}"/>
                </ContextMenu>
            </my:DataGrid.ContextMenu>

2 个答案:

答案 0 :(得分:2)

尝试使用ElementName binding代替Ancestor bindingContextMenu不是Grid的可视化树的一部分。

- 编辑 -

啊,我错了。 ElementName绑定(下面给出的示例)也不适用于ContextMenu。它不是DataGrid可视化树的一部分。这就是为什么它无法看到DataGrid因此无法引用它。您将不得不使用第一种方法。

你不想这样做的原因是什么?

            <DataGrid.ContextMenu>
                <ContextMenu DataContext="{Binding SelectedItem, ElementName=DataGrid1}">
                    <MenuItem Header="Grant Access"
                              IsEnabled="{Binding Connectable}" />
                </ContextMenu>
            </DataGrid.ContextMenu>

答案 1 :(得分:0)

如果在调试模式下查看Visual Studio中的输出窗口,您将获得绑定错误的详细信息 - 这可能会对您的问题有所了解。