TreeView与MVVM中的动态ContextMenu

bit*_*onk 6 wpf treeview contextmenu mvvm

我有一个ViewModel树显示为TreeView(使用HierarchicalDataTemplate).每个ViewModel实例都有不同的命令可以在其上执行,它们再次作为每个项目ViewModel的命令ViewModel列表公开.如何创建单个 ContextMenu,该TreeMenu在右键单击的TreeViewItem处打开,并从基础项ViewModel的命令ViewModels列表中填充其命令?一切都在体面的MVVM时尚......

Jos*_*ose 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;}
}
Run Code Online (Sandbox Code Playgroud)

然后在xaml中

<TreeViewItem>
  <TreeViewItem.ContextMenu Items={Binding CommandList}>
    <ContextMenu.ItemTemplate>
      <DataTemplate>
        <MenuItem Header="{Binding Name}" Command="{Binding}"/>
      </DataTemplate>
    </ContextMenu.ItemTemplate>
  </TreeViewItem.ContextMenu>
</TreeViewItem>
Run Code Online (Sandbox Code Playgroud)

我对分层数据模板没有太多经验,但您可以从上面得到要点。您也可以使用 中的样式执行上述操作,但我面前没有 xaml 编辑器来为您提供正确的语法。

希望有帮助