C# 为什么我的上下文菜单在动态生成时看起来不同
我正在尝试从基本视图模型动态绑定上下文菜单。我已经设法在功能上做了我想做的事情,但我仍然坚持动态上下文菜单与静态上下文菜单相比的外观。似乎有额外级别的菜单项。我的视图模型如下所示C# 为什么我的上下文菜单在动态生成时看起来不同,c#,wpf,xaml,C#,Wpf,Xaml,我正在尝试从基本视图模型动态绑定上下文菜单。我已经设法在功能上做了我想做的事情,但我仍然坚持动态上下文菜单与静态上下文菜单相比的外观。似乎有额外级别的菜单项。我的视图模型如下所示 public ObservableCollection<ContextMenuItem> ContextMenuItems { get; protected set; } protected Constructor { ContextMenuItems = new ObservableCol
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}
};
}
<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>
它看起来不同,因为具体地说,
ContextMenu
将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
不应包含MenuItem
。您看到的是嵌套的MenuItem
s的结果。改用ItemContainerStyle
。
public class ContextMenuItem : ReactiveObject
{
private string _Caption;
public string Caption
{
get { return _Caption; }
set { this.RaiseAndSetIfChanged(ref _Caption, value); }
}
public ReactiveCommand Command { get; set; }
}
<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>
<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>