2011-05-27 113 views
4

使用MVVM结构处理WPF应用程序。动态绑定到Window的MenuItem上的ViewModel命令

我的窗口显示一个菜单和当前的ViewModel。在菜单的一个MenuItems中,我想列出在当前ViewModel中找到的一些命令。菜单中列出的命令将根据ViewModel而改变。

我得到了这个工作很好,但风格搞砸了 - Command MenuItems在另一个菜单框或其他东西。我会附上截图。

我在CommandViewModel中包装了ViewModel的ICommand对象(在此实例中是RelayCommands),它暴露了菜单上我想要的Command和Display字符串。这些CommandViewModel在列表中:CurrentWorkspace.AdditionalOptionsCommands

这里是菜单的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> 

当前外观:

Current Appearance

所需的外观:

Desired Appearance

回答

7

这是因为当您通过ItemsSource指定菜单项目的每个项目就会自动裹成MenuItem对象。通过这种方式,DataTemplateMenuItem元素)中定义的内容被包装成另一个MenuItem

你需要做的,而不是定义DataTemplate什么是定义一个样式为MenuItem在您设置绑定到视图模型的属性和父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控件进行深入说明。

+0

非常酷,谢谢! – 2011-05-27 16:55:54

相关问题