2014-05-12 138 views
1

我想从我的基本视图模型动态绑定上下文菜单。我设法在功能上做我想做的事情,但我坚持我的动态上下文菜单看起来和我的静态菜单相比。似乎有一个额外的菜单项。我的视图模型看起来像这样。为什么动态生成时我的上下文菜单看起来不同

public ObservableCollection<ContextMenuItem> ContextMenuItems { get; protected set; } 

protected Constructor 
{ 
    ContextMenuItems = new ObservableCollection<ContextMenuItem>() 
        { 
         new ContextMenuItem() {Caption = "Add/Replace Supporting Data", Command = AddReplaceSupportingCommand}, 
         new ContextMenuItem() {Caption = "Display SupportingData", Command = DisplaySupportingDataCommand} 
        }; 
} 

第一个上下文菜单的xaml我们是这样生成的。

<StackPanel Orientation="Vertical" Margin="0,20"> 
      <StackPanel.ContextMenu > 
       <ContextMenu ItemsSource="{Binding ContextMenuItems}"> 
        <ContextMenu.ItemTemplate> 
         <DataTemplate> 
          <MenuItem Command="{Binding Command}" Header="{Binding Caption}"/> 
         </DataTemplate> 
        </ContextMenu.ItemTemplate> 
       </ContextMenu> 
      </StackPanel.ContextMenu> 
... 

</StackPanel> 

第二上下文菜单中的XAML看起来像这样

<StackPanel > 
     <StackPanel.ContextMenu> 
      <ContextMenu> 
       <MenuItem Command="{Binding AddReplaceSupportingCommand}" Header="Add or Replace Supporting Data"/> 
       <MenuItem Command="{Binding DisplaySupportingDataCommand}" Header="Display Supporting Data"/> 
      </ContextMenu> 
     </StackPanel.ContextMenu> 
... 
</StackPanel> 

(为了完整性,这里的ContextMenuItem类)

public class ContextMenuItem : ReactiveObject 
    { 
     private string _Caption; 
     public string Caption 
     { 
      get { return _Caption; } 
      set { this.RaiseAndSetIfChanged(ref _Caption, value); } 
     } 

     public ReactiveCommand Command { get; set; } 
    } 

Differences between dynamic and statically generated context menus

+3

的'ItemTemplate'是不应该包含'MenuItem'。你看到的是嵌套的'MenuItem'的结果。改用'ItemContainerStyle'。 –

回答

2

它看起来不同,因为ContextMenuMenuBase具体而言,使用MenuItem作为ItemContainerStyle,因此您正在有效地将MenuItem包裹在MenuItem之内。试试这个:

<StackPanel Orientation="Vertical" Margin="0,20"> 
    <StackPanel.ContextMenu> 
     <ContextMenu ItemsSource="{Binding ContextMenuItems}"> 
      <ContextMenu.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}"> 
        <Setter Property="Header" Value="{Binding Caption}"/> 
        <Setter Property="Command" Value="{Binding Command}"/> 
       </Style> 
      </ContextMenu.ItemContainerStyle> 
     </ContextMenu> 
    </StackPanel.ContextMenu> 
    <!-- ... --> 
</StackPanel> 

你可以使用ItemTemplate但如果你想使用类似TextBox代替

<StackPanel Orientation="Vertical" Margin="0,20"> 
    <StackPanel.ContextMenu > 
     <ContextMenu ItemsSource="{Binding ContextMenuItems}"> 
      <ContextMenu.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}"> 
        <Setter Property="Command" Value="{Binding Command}"/> 
       </Style> 
      </ContextMenu.ItemContainerStyle> 
      <ContextMenu.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Caption}"/> 
       </DataTemplate> 
      </ContextMenu.ItemTemplate> 
     </ContextMenu> 
    </StackPanel.ContextMenu> 
    <!-- ... --> 
</StackPanel> 
相关问题