如何解决动态绑定到Window的MenuItem上的ViewModel命令
|| 使用MVVM结构在WPF应用程序上工作。 我的窗口显示一个菜单和当前的ViewModel。在Menu的MenuItem之一上,我想列出一些在当前ViewModel中找到的命令。菜单中列出的命令将根据ViewModel进行更改。 我使它工作正常,但是样式搞砸了-Command MenuItems在另一个菜单框之内。我将附上屏幕截图。 我将ViewModel的ICommand对象(在此示例中为RelayCommands)包装在CommandViewModel中,该对象在菜单上公开了我想要的Command和Display字符串。这些CommandViewModels在列表中:“ 0”。 这是菜单的XAML。就像我说的那样,它有效,它显示正确的项目并执行了命令。显示内容不正确-有人可以告诉我原因以及如何解决吗?查看屏幕截图。<Menu>
<MenuItem Header=\"_Additional Options...\" ItemsSource=\"{Binding Path=CurrentWorkspace.AdditionalOptionsCommands}\">
<MenuItem.ItemTemplate>
<DataTemplate DataType=\"{x:Type vm:CommandViewModel}\">
<MenuItem Header=\"{Binding Path=DisplayText}\" Command=\"{Binding Path=Command}\"/>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
<MenuItem Header=\"_Testing\">
<MenuItem Header=\"This looks right\" />
<MenuItem Header=\"This looks right\" />
</MenuItem>
</Menu>
当前外观:
所需外观:
解决方法
这是因为当您通过
ItemsSource
指定菜单项时,每个项目都会自动包装到MenuItem
对象中。这样,在DataTemplate
(MenuItem
元素)中定义的内容将被包装为另一个MenuItem
。
您需要为MenuItem
定义一种样式,而不是定义DataTemplate
,您可以在其中设置与视图模型属性的绑定,并将此样式用作父MenuItem
上的ItemContainerStyle
:
<Window.Resources>
<Style x:Key=\"CommandMenuItemStyle\"
TargetType=\"{x:Type MenuItem}\">
<Setter Property=\"Header\"
Value=\"{Binding Path=DisplayText}\"/>
<Setter Property=\"Command\"
Value=\"{Binding Path=Command}\"/>
</Style>
</Window.Resources>
...
<Menu>
<MenuItem Header=\"_Additional Options...\"
ItemsSource=\"{Binding Path=CurrentWorkspace.AdditionalOptionsCommands}\"
ItemContainerStyle=\"{StaticResource CommandMenuItemStyle}\"/>
<MenuItem Header=\"_Testing\">
<MenuItem Header=\"This looks right\" />
<MenuItem Header=\"This looks right\" />
</MenuItem>
</Menu>
请参阅http://drwpf.com/blog/2008/03/25/itemscontrol-i-is-for-item-container/了解有关项目容器如何与ItemsControl
控件一起使用的深入说明。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。