绑定未找到带有引用的源(MenuItem)

Lai*_*zor 4 c# wpf xaml

我收到错误消息:

System.Windows.Data错误:4:找不到参考'ElementName = gridProductViewDataGrid'的绑定源。BindingExpression:Path = SelectedItem; DataItem = null; 目标元素是'MenuItem'(Name =''); 目标属性为“ IsEnabled”(类型为“布尔”)

在Visual Studio的“输出”窗口中,我的代码没有执行应做的事情。

该添加工作正常,因为它不需要禁用,但不禁用删除。

<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>
Run Code Online (Sandbox Code Playgroud)

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

Bla*_*hma 5

ContextMenu在与其父级不同的Visual Tree上打开,因此命名绑定将不起作用。

尝试这样的事情:

IsEnabled="{Binding PlacementTarget.DataContext.SelectedItem, 
                    RelativeSource={RelativeSource FindAncestor,AncestorType=ContextMenu}, 
                    Converter={StaticResource ObjectToBooleanConverter}}"
Run Code Online (Sandbox Code Playgroud)

它使用ContextMenu的PlacementTarget(即DataGrid)来获取正确的DataContext。

另一个选项是NameScope为ContextMenu 设置。将以下行添加到您的CodeBehind中:

NameScope.SetNameScope(contextMenu, NameScope.GetNameScope(this));
Run Code Online (Sandbox Code Playgroud)

contextMenu您给您的ContextMenu指定的名称在哪里