我把我认为是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方法创建上下文菜单,所以我可能错过了某个地方的步骤。
如果您阅读了所有这些,非常感谢。如果我错过了任何信息,请告诉我。
答案 0 :(得分:2)
您不应该将MenuItem
添加到ItemTemplate
的{{1}}。您应该定义ContextMenu
并绑定到您班级的ItemContainerStyle
和Displayname
属性:
ContextMenuCommand