динамический ContextMenu в TreeView по сравнению с MVVM

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

6
задан bitbonk 24 March 2010 в 14:17
поделиться

1 ответ

Думаю, я понял ваш вопрос. Я думаю, что вы могли бы структурировать ваши 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, чтобы дать вам правильный синтаксис.

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

3
ответ дан 17 December 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: