динамическое ContextMenu в TreeView против MVVM - PullRequest
6 голосов
/ 24 марта 2010

У меня есть дерево ViewModels, отображаемое как TreeView (используя HierarchicalDataTemplate). Каждый экземпляр ViewModel имеет различные команды, которые могут быть выполнены на нем, которые снова отображаются в виде списка команд ViewModel для каждого элемента ViewModel. Как я могу создать single ContextMenu, которое открывается в TreeViewItem, который был нажат правой кнопкой мыши и который заполняет его команды из базового элемента ViewModels в списке команд ViewModels? Все в приличном моде MVVM ...

1 Ответ

3 голосов
/ 25 марта 2010

Мне кажется, я понимаю ваш вопрос. Я думаю, что вы могли бы структурировать свои ViewModels следующим образом:

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, который бы дал вам правильный синтаксис.

Надеюсь, что поможет

...