我是WPF的新手。像许多其他人一样,我正在尝试将ContextMenu
绑定到ObservableCollection
以创建动态上下文菜单。
除了将Command
属性绑定到表示菜单项的TheCommand
类的MenuItemViewModel
属性外,一切都有效。该命令未被触发。我做错了什么?
要从头开始,ContextMenu
是Image
的孩子,当鼠标悬停在Image
上时会显示 <Image.ContextMenu >
<ContextMenu ItemsSource="{DynamicResource ContextMenu}"
。
<Window.Resources>
<local:MenuItemViewModelCollection x:Key="ContextMenu">
</local:MenuItemViewModelCollection>
<HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}"
ItemsSource="{Binding Path=Children}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command"
Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}},
Path=DataContext.TheCommand}"/>
<!-- Value="{Binding Path=TheCommand}" /> I tried this too -->
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
</HierarchicalDataTemplate>
</Window.Resources>
其中空的ContextMenu定义如下:
TheCommand
public class MenuItemViewModel : INotifyPropertyChanged
{
//...
public ICommand TheCommand
{
//...
}
}
属性定义如下:
{{1}}
答案 0 :(得分:4)
ContextMenus上的DataContext可能很奇怪,我打赌如果你在调试时查看Visual Studio中的输出窗口,那么将找不到TheCommand的绑定错误。请尝试以下方法:
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.DataContext.TheCommand}"/>
这将使用启动ContextMenu的元素的DataContext,而不是上下文菜单本身。
答案 1 :(得分:0)
你试过吗
Value="{TemplateBinding TheCommand}"
?
答案 2 :(得分:0)