4

我收到错误消息:

System.Windows.Data 错误:4:找不到与引用“ElementName = gridProductViewDataGrid”绑定的源。绑定表达式:路径=选定项;数据项=空;目标元素是'MenuItem'(名称='');目标属性是“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>

如果没有对象,则转换器只需返回 true,如果存在则返回 false。我已经尝试将此代码移入和移出网格以及以不同的顺序移动绑定的部分。当我运行代码并放入断点时,它从未进入布尔转换器的代码。为什么它在里面时看不到网格?

4

1 回答 1

5

ContextMenu 在不同的可视树上打开,然后是他的父级,因此命名绑定不起作用。

尝试这样的事情:

IsEnabled="{Binding PlacementTarget.DataContext.SelectedItem, 
                    RelativeSource={RelativeSource FindAncestor,AncestorType=ContextMenu}, 
                    Converter={StaticResource ObjectToBooleanConverter}}"

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

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

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

contextMenu你给你的 ContextMenu 的名字在哪里

于 2013-01-21T21:44:09.207 回答