TreeView与MVVM中的动态ContextMenu

时间:2010-03-24 14:17:31

标签: wpf mvvm treeview contextmenu

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

1 个答案:

答案 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编辑器来为您提供正确的语法。

希望有所帮助