我收到错误消息:
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。我试过将此代码移入和移出网格,以及按不同顺序移动绑定的各个部分。当我运行代码并将其置于断点时,它从未进入过布尔转换器的代码。为什么在网格内部时看不到网格?
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指定的名称在哪里