C# 绑定找不到引用的源(MenuItem)

C# 绑定找不到引用的源(MenuItem),c#,wpf,xaml,C#,Wpf,Xaml,我得到一个错误: System.Windows.Data错误:4:找不到与绑定的源 参考'ElementName=gridProductViewDataGrid'。 BindingExpression:Path=SelectedItem;DataItem=null;目标元素是 “菜单项”(名称=”;目标属性为“IsEnabled”(类型为“Boolean”) 在VisualStudio的输出窗口中,我的代码没有执行它应该执行的操作 添加可以正常工作,因为它永远不需要被禁用,但是删除没有被禁用 &

我得到一个错误:

System.Windows.Data错误:4:找不到与绑定的源 参考'ElementName=gridProductViewDataGrid'。 BindingExpression:Path=SelectedItem;DataItem=null;目标元素是 “菜单项”(名称=”;目标属性为“IsEnabled”(类型为“Boolean”)

在VisualStudio的输出窗口中,我的代码没有执行它应该执行的操作

添加可以正常工作,因为它永远不需要被禁用,但是删除没有被禁用

<DataGrid AutoGenerateColumns="False" IsReadOnly="False" CanUserAddRows="False" CanUserDeleteRows="False" EnableRowVirtualization="True" ItemsSource="{Binding Items, Mode=TwoWay}" x:Name="gridViewProductDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" >
        <DataGrid.ContextMenu>
            <ContextMenu>
                <MenuItem Header="{Binding LabelStrings.AddProductLabel, Source={StaticResource ResourceWrapper}}" Click="Add_Product_MenuItem_Click"/>
                <MenuItem Header="{Binding LabelStrings.RemoveProductLabel, Source={StaticResource ResourceWrapper}}" Click="Remove_Product_MenuItem_Click" IsEnabled="{Binding ElementName=gridViewProductDataGrid, Path=SelectedItem, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource ObjectToBooleanConverter}}"/>
                </MenuItem>
            </ContextMenu>
        </DataGrid.ContextMenu>

其中,如果没有对象,转换器将返回true;如果存在对象,则返回false。
我尝试过将这段代码移入和移出网格,以及以不同的顺序移动部分绑定。当我运行代码并输入断点时,它从未进入布尔转换器的代码中。为什么它在网格内部时看不到网格?

上下文菜单在与其父树不同的可视树上打开,因此命名绑定无法工作

试着这样做:

IsEnabled="{Binding PlacementTarget.DataContext.SelectedItem, 
                    RelativeSource={RelativeSource FindAncestor,AncestorType=ContextMenu}, 
                    Converter={StaticResource ObjectToBooleanConverter}}"
它使用上下文菜单的
PlacementTarget
(即数据网格)获取正确的数据上下文

另一个选项是为上下文菜单设置
名称范围
。在代码隐藏中添加以下行:

NameScope.SetNameScope(contextMenu, NameScope.GetNameScope(this));

其中,
contextMenu
是您为contextMenu提供的名称

我现在已设法获得一个新错误
System.Windows.Data错误:40:BindingExpression路径错误:“在”“对象”“GridViewProductUserControl'(名称=“”)上未找到PlacementTarget”属性。BindingExpression:Path=PlacementTarget.DataContext.SelectedItem;DataItem='GridViewProductUserControl'(名称='');目标元素是“MenuItem”(名称=“”);目标属性为“IsEnabled”(类型为“Boolean”)
对,我没有注意到您在菜单项上设置了此选项-我使用上下文菜单的相对资源更新了我的答案。太棒了!但是,我必须删除“DataContext”部分才能绑定到DataGrid的SelectedItem值:当
菜单项
菜单中而不是
上下文菜单上时,您是如何做到这一点的?