将CommandParameter绑定到所属对象的属性

本文关键字:对象 属性 CommandParameter 绑定 | 更新日期: 2023-09-27 18:12:50

我正在构建一个动态上下文菜单。为了实现这一点,我已经提出了一个自定义视图模型,它代表我的上下文菜单,定义如下:

public class ContextMenuVM {
  public object ContextItem { get; set; }
  public ObservableCollection<ICommand> Items { get; private set; }
}

属性Items保存在上下文菜单中显示的有效命令,属性ContextItem保存这些命令将在其上执行的上下文项。

此外,我有一个单例类,其中包含我所有的各种命令及其实现。最后,视图模型上会有一个名为UpdateContextMenu的方法它拥有contextmenu它的作用是这样的

ContextMenu.Items.Clear();
ContextMenu.Items.Add(SingletonClass.Instance.CommandA);
if (condition)
  ContextMenu.Items.Add(SingletonClass.Instance.CommandB);

XAML中的ContextMenu是这样定义的:

<ContextMenu ItemsSource="{Binding Path=ContextMenu.Items}">
  <ContextMenu.ItemTemplate>
    <DataTemplate>
      <ContentControl>
        <MenuItem Command="{Binding}" CommandParameter="what-goes-here?" />
      </ContentControl>
    </DataTemplate>
  </ContextMenu.ItemTemplate>
</ContextMenu>

我未能实现的是使CommandParameter绑定工作。我应该如何绑定到ContextMenuVM实例的ContextItem属性?

将CommandParameter绑定到所属对象的属性

如果没有一个好的最小化、完整和可验证的代码示例来清楚地显示您在做什么,就不可能确定。但是根据您目前提供的信息,您似乎正在寻找RelativeSource绑定源。例如:

<ContextMenu ItemsSource="{Binding Path=ContextMenu.Items}">
  <ContextMenu.ItemTemplate>
    <DataTemplate>
      <ContentControl>
        <MenuItem Command="{Binding}"
                  CommandParameter="{Binding ContextMenu.ContextItem
                      RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
      </ContentControl>
    </DataTemplate>
  </ContextMenu.ItemTemplate>
</ContextMenu>

我不得不根据您的ItemsSource绑定猜测绑定路径,因为您的原始代码示例不完整。基本思想是绑定到一个相对于指定源的路径,因此我假设ContextMenu引用一个属性,该属性返回您正在使用的ContextMenuVM对象。

如果这不能解决你的问题,请通过提供一个好的MCVE来改进它。