C# 行为异常上下文菜单(mvvm)
我把我认为是MVVM设置中的上下文菜单放在了一起(我将WPF与XAML和C#一起使用,使用MVVM)。只是它不起作用,这就是我来这里的原因。我的上下文菜单上什么都没有 XAML应该在代码隐藏中调用ICommand(或者中继命令,因为我使用的是micro MVVM——基本上是一样的) 第一件事是设置一个对象,XAML可以从中获得两个所需的值——头和命令。所讨论的项目如下所示: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
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>
对我来说似乎很好。我不知道你的为什么没有。你有没有尝试过我提出的解决方案,或者发生了什么?