2011-05-27 121 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

相關問題