将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
属性?
如果没有一个好的最小化、完整和可验证的代码示例来清楚地显示您在做什么,就不可能确定。但是根据您目前提供的信息,您似乎正在寻找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来改进它。