C# 行为异常上下文菜单(mvvm)

C# 行为异常上下文菜单(mvvm),c#,wpf,mvvm,contextmenu,C#,Wpf,Mvvm,Contextmenu,我把我认为是MVVM设置中的上下文菜单放在了一起(我将WPF与XAML和C#一起使用,使用MVVM)。只是它不起作用,这就是我来这里的原因。我的上下文菜单上什么都没有 XAML应该在代码隐藏中调用ICommand(或者中继命令,因为我使用的是micro MVVM——基本上是一样的) 第一件事是设置一个对象,XAML可以从中获得两个所需的值——头和命令。所讨论的项目如下所示: class ContextMenuVM : ObservableObject { public string Di

我把我认为是MVVM设置中的上下文菜单放在了一起(我将WPF与XAML和C#一起使用,使用MVVM)。只是它不起作用,这就是我来这里的原因。我的上下文菜单上什么都没有

XAML应该在代码隐藏中调用ICommand(或者中继命令,因为我使用的是micro MVVM——基本上是一样的)

第一件事是设置一个对象,XAML可以从中获得两个所需的值——头和命令。所讨论的项目如下所示:

class ContextMenuVM : ObservableObject
{
    public string Displayname { get; set; }
    public RelayCommand ContextMenuCommand { get; set; }
}
所以,这很简单。这些将用于菜单中的绑定

此处的视图模型称为“CharacterListViewModel”,如果这些ContextMenuVM对象存在,则包含一个ObservableCollection。看起来是这样的:

private ObservableCollection<ContextMenuVM> _sceneAddMenu = new ObservableCollection<ContextMenuVM>();
public ObservableCollection<ContextMenuVM> SceneAddMenu
{
    get { return _sceneAddMenu; }
    set
    {
        if (_sceneAddMenu != value)
        {
            _sceneAddMenu = value;
            RaisePropertyChanged("SceneAddMenu");
        }
    }
}
<ContextMenu x:Key="CharacterMenu">
    <MenuItem Header="Edit" Command="{Binding EditCharacter}"/>
</ContextMenu>
<StackPanel Orientation="Horizontal" Margin="3" ContextMenu="{StaticResource CharacterMenu}">
目前只是一个测试,但我可以通过使用断点说,SceneAddMenu在运行此代码后包含四项(正如我所期望的)

嗯,这是一种背景代码。我怀疑它起作用了,尽管很明显有些东西坏了。我的怀疑是XAML

上下文菜单代码本身如下所示:

<ContextMenu x:Key="CharacterMenu" ItemsSource="{Binding SceneAddMenu}">
    <ContextMenu.ItemTemplate >
        <DataTemplate DataType="MenuItem">
            <MenuItem Header="Edit" Command="{Binding ContextMenuCommand}"></MenuItem>
        </DataTemplate>
    </ContextMenu.ItemTemplate>
</ContextMenu>

啊,所以明显的问题是数据上下文设置不正确。事实并非如此,因为此关联菜单替换了另一个在视图模型中使用命令的关联菜单(该菜单有效),所以我的假设是视图模型没有问题

对于记录,前一个上下文菜单(有效)如下所示:

private ObservableCollection<ContextMenuVM> _sceneAddMenu = new ObservableCollection<ContextMenuVM>();
public ObservableCollection<ContextMenuVM> SceneAddMenu
{
    get { return _sceneAddMenu; }
    set
    {
        if (_sceneAddMenu != value)
        {
            _sceneAddMenu = value;
            RaisePropertyChanged("SceneAddMenu");
        }
    }
}
<ContextMenu x:Key="CharacterMenu">
    <MenuItem Header="Edit" Command="{Binding EditCharacter}"/>
</ContextMenu>
<StackPanel Orientation="Horizontal" Margin="3" ContextMenu="{StaticResource CharacterMenu}">

如果我把它放回去,它就会起作用。由于它与视图模型有绑定,这表明数据上下文不是问题所在

上下文菜单本身稍后会被引用,如下所示:

private ObservableCollection<ContextMenuVM> _sceneAddMenu = new ObservableCollection<ContextMenuVM>();
public ObservableCollection<ContextMenuVM> SceneAddMenu
{
    get { return _sceneAddMenu; }
    set
    {
        if (_sceneAddMenu != value)
        {
            _sceneAddMenu = value;
            RaisePropertyChanged("SceneAddMenu");
        }
    }
}
<ContextMenu x:Key="CharacterMenu">
    <MenuItem Header="Edit" Command="{Binding EditCharacter}"/>
</ContextMenu>
<StackPanel Orientation="Horizontal" Margin="3" ContextMenu="{StaticResource CharacterMenu}">

但由于之前的菜单(即,当它工作时)中也包含了这一点,因此我仅出于完成的考虑才将其包括在内

因此,将填充SceneAddMenu对象(ObservableCollection)。那似乎很好。但是,XAML和视图模型之间的某个地方一定有问题。如果我在SceneAddMenus的“get”中设置断点,然后右键单击有问题的项,则断点不会激活

在这件事上我有点不知所措。这是我第一次使用MVVM方法创建上下文菜单,所以我可能遗漏了某个步骤


如果你读了所有这些,非常感谢。如果我遗漏了任何信息,请告诉我。

您不应该将
菜单项添加到
上下文菜单的
项模板中。您应该定义
ItemContainerStyle
并绑定到类的
Displayname
ContextMenuCommand
属性:

<ContextMenu x:Key="CharacterMenu" ItemsSource="{Binding SceneAddMenu}">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Header" Value="{Binding Displayname}" />
            <Setter Property="Command" Value="{Binding ContextMenuCommand} " />
        </Style>
    </ContextMenu.ItemContainerStyle>
</ContextMenu>


对我来说似乎很好。我不知道你的为什么没有。你有没有尝试过我提出的解决方案,或者发生了什么?