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