我的应用程序中有菜单。我使用分层数据模板将其可视化:
<MenuItem Header="Main menu" ItemsSource="{Binding ApplicationMenu}" >
<MenuItem.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type tm:RMenuItem}"
ItemsSource="{Binding Path=ChildrenItems}">
<MenuItem Header="{Binding Name}" Command="{Binding RunOperationCommand}" />
</HierarchicalDataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
菜单看起来应该是这样,但是每个菜单项的命令都没有被触发!更重要的是 - 它不受限制,这可以在调试器中看到:ICommand 属性的 get 访问器从未执行过。
为什么会出现这样的情况呢?
像往常一样做就完美了:
<Menu>
<MenuItem Header="SomeHeader" Command="{Binding RunOperationCommand}"/>
<Menu>
您的问题中的第一个和第二个示例之间的区别在于,在第二个代码片段中您绑定MenuItem.Command
到父级的数据上下文,其中有RunOperationCommand
定义的。而在第一个例子中HierarchicalDataTemplate
您正在绑定到“本地”DataContext,它是一个菜单项。它没有适当的属性,因此绑定失败。
您有多种选择:
- 一种是使用 command 属性扩展菜单项,就像您在答案中所做的那样;
- 绑定到可视化树中的相对源,该源具有带有命令的数据上下文,例如假设该命令位于窗口的 DataContext 中:
<MenuItem Header="Main menu" ItemsSource="{Binding ApplicationMenu}" >
<MenuItem.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type tm:RMenuItem}"
ItemsSource="{Binding Path=ChildrenItems}">
<MenuItem Header="{Binding Name}"
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.RunOperationCommand}"
/>
</HierarchicalDataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
- 从您的命令创建一个 StaticResource,类似于这篇博文的方法 http://joyfulwpf.blogspot.com/2009/05/mvvm-commandreference-and-keybinding.html
<Window.Resources>
<coreView:CommandReference x:Key="RunOperationCommand"
Command="{Binding RunOperationCommand}" />
</Window.Resources>
<MenuItem Header="Main menu" ItemsSource="{Binding ApplicationMenu}" >
<MenuItem.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type tm:RMenuItem}"
ItemsSource="{Binding Path=ChildrenItems}">
<MenuItem Header="{Binding Name}"
Command="{StaticResource RunOperationCommand}"
/>
</HierarchicalDataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)