WPF相对源和祖先类型数据绑定

3

我在尝试让一些绑定代码工作。基本上,我想把我的网格上下文菜单元素的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个回答

2
尝试使用ElementName绑定而不是Ancestor绑定ContextMenu不是Grid的可视树的一部分。
--编辑--
啊,我错了。 ElementName绑定(下面给出示例)也无法与ContextMenu一起使用。它不是DataGrid的可视树的一部分。这就是为什么它无法看到DataGrid并因此无法引用它。您将不得不使用第一种方法。
您不想以那种方式做的原因是什么?
            <DataGrid.ContextMenu>
                <ContextMenu DataContext="{Binding SelectedItem, ElementName=DataGrid1}">
                    <MenuItem Header="Grant Access"
                              IsEnabled="{Binding Connectable}" />
                </ContextMenu>
            </DataGrid.ContextMenu>

嗨!你知道怎么做这个的语法吗? - Bob
这看起来不错,但是当我尝试时,从输出窗口中出现了错误:System.Windows.Data Error: 4 : 找不到引用 'ElementName=dataGridInstall' 的绑定源。BindingExpression:Path=SelectedItem; DataItem=null; target element is 'ContextMenu' (Name=''); target property is 'DataContext' (type 'Object')。 - Bob
这就是我说的。它行不通。你必须使用你的第一种方法,它使用了 PlacementTarget.SelectedItem 的绑定。 - decyclone

0

如果您在调试模式下查看Visual Studio的输出窗口,您将得到有关绑定错误的详细信息,这可能会为您解决问题提供一些线索。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接