我正在构建一个动态上下文菜单。为了实现这一点,我想出了一个代表我的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
属性?
答案 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来改进它。