行为不端的上下文菜单(mvvm)

时间:2017-04-09 15:05:42

标签: c# wpf mvvm contextmenu

我把我认为是MVVM设置中的上下文菜单放在一起(我正在使用带有XAML和C#的WPF,使用MVVM)。只有它不起作用,这就是为什么我在这里。我的上下文菜单中没有任何内容。

XAML应该在后面的代码中调用ICommand(或者因为我使用micro MVVM而在Relay Command中调用 - 基本相同)。

首先要设置一个对象,XAML可以从Header和Command中获取两个需要的值。有问题的项目如下所示:

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");
        }
    }
}

填充ObservableCollection,如下所示:

foreach (Scene s in Database.Instance.Scenes)
{
    SceneAddMenu.Add(new ContextMenuVM()
    {
        Displayname = s.SceneName, ContextMenuCommand = new RelayCommand(
        () =>
            {
            MessageBox.Show("Clicked");
            })
    });                            
}

目前只是一个测试,但我可以通过使用断点来说,在运行此代码后,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>

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

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

<ContextMenu x:Key="CharacterMenu">
    <MenuItem Header="Edit" Command="{Binding EditCharacter}"/>
</ContextMenu>

如果我把它重新放入,它就可以了。由于它具有对视图模型的绑定,这表明数据上下文不是问题。

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

<StackPanel Orientation="Horizontal" Margin="3" ContextMenu="{StaticResource CharacterMenu}">

但由于之前的菜单(即工作时间)也是如此,我只是为了完成而将它包括在内。

因此填充了SceneAddMenu对象(ObservableCollection)。这似乎很好。在XAML和视图模型之间的某处,必然存在问题。如果我在SceneAddMenu的'get'中设置了一个断点,然后右键单击有问题的项目,则断点不会激活。

我对此感到有点失落。这是我第一次使用MVVM方法创建上下文菜单,所以我可能错过了某个地方的步骤。

如果您阅读了所有这些,非常感谢。如果我错过了任何信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

您不应该将MenuItem添加到ItemTemplate的{​​{1}}。您应该定义ContextMenu并绑定到您班级的ItemContainerStyleDisplayname属性:

ContextMenuCommand