将CommandParameter绑定到拥有对象的属性

时间:2016-10-11 21:47:58

标签: c# wpf xaml

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

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

属性Items包含要在contextmenu中显示的有效命令,属性ContextItem包含要在其上执行这些命令的上下文项。

此外,我有一个单例类,它包含我所有的各种命令及其实现。所以最后会有一个方法在viewmodel上被称为UpdateContextMenu,它拥有执行类似这样的上下文菜单:

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

XAML中的ContextMenu iteself定义如下:

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

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

1 个答案:

答案 0 :(得分:0)

如果没有能够清楚地显示您正在做的事情的良好Minimal, Complete, and Verifiable code example,那么肯定无法确定。但根据您目前提供的信息,您似乎正在寻找RelativeSource绑定源。 E.g:

<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来改进它。