0

我有一个带有 Grid 的 ContentControl。每个 ListBoxItem 的 ContextMenu 都有一个模板。上下文菜单看起来像这样:

<ContentControl.Resources>
    <ContextMenu x:Key="SimpleDataObjectContextMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
        <MenuItem Header="Create" Command="{Binding AddRelation}" CommandParameter="..Name..of..caller.."/>
        <MenuItem Header="Delete" Command="{Binding DeleteRelation}" CommandParameter="..Name..of..caller.."//>
    </ContextMenu>
</ContentControl.Resources>

网格如下所示:

<Grid>
    <Rectangle x:Name="LeftRectangle" Width="5" Height="5" Fill="Black" Margin="5" ContextMenu="{StaticResource SimpleDataObjectContextMenu}"/>
    <TextBlock Text="{Binding Model.Name}"/>
    <Rectangle x:Name="RightRectangle" Width="5" Height="5" Fill="Black" Margin="5" ContextMenu="{StaticResource SimpleDataObjectContextMenu}"/>
</Grid>

我想从“LeftRectangle”和“RightRectangle”(它们使用自己的 ContextMenu 模板“SimpleDataObjectContextMenu”)提交 x:Name 到“SimpleDataObjectContextMenu”,以便我可以将此名称作为模板中的 CommandParameter 提交。

而不是 ..Name..of..caller.. 例如,如果在左侧矩形上打开了 ContextMenu,我想发送“LeftRectangle”...

任何想法,我怎么能意识到这一点?

4

2 回答 2

1

从您的中删除DataContext绑定ContextMenu

<ContextMenu x:Key="SimpleDataObjectContextMenu" >
    <MenuItem Header="Create" Command="{Binding AddRelation}" CommandParameter="{Binding Parent.PlacementTarget.Name, RelativeSource={RelativeSource Self}}"/>
    <MenuItem Header="Delete" Command="{Binding DeleteRelation}" CommandParameter="{Binding Parent.PlacementTarget.Name, RelativeSource={RelativeSource Self}}"/>
</ContextMenu>
于 2014-04-23T08:57:30.943 回答
0

您可以像这样绑定命令参数

 CommandParameter="{Binding Path=Menu.UIElement, RelativeSource={RelativeSource Self}

在后面的代码中,您可以像这样使用 Rectangle 转换参数

      var rectangle = parameter as Rectangle ;
      if(rectangle != null)
      {
       var name = rectangle.Name;
      }
于 2014-04-23T09:02:55.633 回答