Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的上下文菜单在动态生成时看起来不同_C#_Wpf_Xaml - Fatal编程技术网

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>