所以我整天都在用这个撞墙。
在我的 WPF 应用程序(使用 MVVM Light)中,我有一个绑定到视图模型集合的上下文菜单,它的行为并不完全正确。我可以创建我的菜单,一切都与我的 MenuItems 树完美配合,行为、正在执行的命令以及正确的参数通过。我正在使用它来制作一个上下文菜单,允许用户将项目添加到文件夹。
我遇到的问题是,当上下文菜单项具有子项时,不再触发该命令。因此,我只能将项目添加到没有子文件夹的文件夹中。
我已经使用 Snoop 对此进行了调查,并且我的 DataContext 为 MenuItem 正确显示,并且命令已正确绑定,并且鼠标按下事件确实被触发。
我遇到的问题是,如果 MenuItem 有子项,它的命令就不会被执行。任何没有子项的项,该命令都会毫无问题地执行。
我在这里真的很茫然,关于Stack Overflow或MSDN社交的每个类似问题仍然没有答案。
我已经在一种样式中设置了我的绑定。
<utility:DataContextSpy x:Key="Spy" />
<!-- Context style (in UserControl.Resources) -->
<Style x:Key="ContextMenuItemStyle" TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="ItemsSource" Value="{Binding Children}"/>
<Setter Property="Command" Value="{Binding Command}" />
<Setter Property="CommandParameter" Value="{Binding DataContext, Source={StaticResource Spy}" />
<Setter Property="CommandTarget" Value="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
</Style>
<!-- Later in the control -->
<ContextMenu ItemContainerStyle="{StaticResource ContextMenuItemStyle}" ItemsSource="{Binding MenuItems}" />
请注意,DataSpy 来自本文,其工作原理如下所述,允许我将 usedcontrol 的数据上下文用作命令参数
http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF
这是用于上下文菜单的视图模型
public interface IContextMenuItem
{
string Header { get; }
IEnumerable<IContextMenuItem> Children { get; }
ICommand Command { get; set; }
}
public class BasicContextMenuItem : ViewModelBase, IContextMenuItem
{
#region Declarations
private string _header;
private IEnumerable<IContextMenuItem> _children;
#endregion
#region Constructor
public BasicContextMenuItem(string header)
{
Header = header;
Children = new List<IContextMenuItem>();
}
#endregion
#region Observables
public string Header
{
get { return _header; }
set
{
_header = value;
RaisePropertyChanged("Header");
}
}
public IEnumerable<IContextMenuItem> Children
{
get { return _children; }
set
{
_children = value;
RaisePropertyChanged("Children");
}
}
public ICommand Command { get; set; }
#endregion
}
下面是上下文项的实际使用方式。
MenuItems = new List<IContextMenuItem>
{
new BasicContextMenuItem("New Folder") { Command = NewFolderCommand} ,
new BasicContextMenuItem("Delete Folder") { Command = DeleteFolderCommand },
new BasicContextMenuItem("Rename") { Command = RenameFolderCommand },
};
public ICommand NewFolderCommand
{
get { return new RelayCommand<FolderViewModel>(NewFolder); }
}
private void NewFolder(FolderViewModel viewModel)
{
// Do work
}
我看到问题出在 XAML 绑定上。你需要的是HierarchicalDataTemplate
绑定。该代码没有绑定我认为导致问题的孩子的命令。
检查这是否有帮助 - 命令绑定在动态 MVVM 上下文菜单中不起作用