我有一个ViewModel树显示为TreeView(使用HierarchicalDataTemplate)。每个ViewModel实例都有不同的命令可以在其上执行,它们再次作为每个项目ViewModel的命令ViewModel列表公开。如何创建一个单个 ContextMenu,它在右键单击的TreeViewItem上打开,并从基础项ViewModel的命令ViewModels列表中填充其命令?一切都是体面的MVVM时尚......
答案 0 :(得分:3)
我想我理解你的问题。我认为您可以像这样构建ViewModel:
interface ICommandViewModel : ICommand
{
string Name {get;}
}
interface INodeViewModel
{
IEnumerable<ICommandViewModel> CommandList {get;}
}
public class NodeViewModel : INodeViewModel
{
public NodeViewModel()
{
//Init commandList
//Populate commandList here(you could also do lazy loading)
}
public NodeViewModel(IEnumerable<ICommandViewModel> commands)
{
CommandList = commands;
}
public IEnumerable<ICommandViewModel> CommandList {get;private set;}
}
然后在xaml
<TreeViewItem>
<TreeViewItem.ContextMenu Items={Binding CommandList}>
<ContextMenu.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding Name}" Command="{Binding}"/>
</DataTemplate>
</ContextMenu.ItemTemplate>
</TreeViewItem.ContextMenu>
</TreeViewItem>
我对分层数据模板没有太多经验,但是你从上面得到了要点。您也可以使用样式执行上述操作但我没有在我面前使用xaml编辑器来为您提供正确的语法。
希望有所帮助