У меня есть дерево ViewModels, отображаемое как TreeView (с использованием HierarchicalDataTemplate). Каждый экземпляр ViewModel имеет разные команды, которые могут быть выполнены на нем, которые снова отображаются в виде списка команд ViewModels для каждого элемента ViewModel. Как я могу создать одиночный ContextMenu, который открывается в TreeViewItem, который был правильно выбран, и который заполняет его команды из списка ViewModel в представлении ViewModel? Все в приличной моде MVVM ...динамический ContextMenu в TreeView против MVVM
6
A
ответ
3
Я думаю, что я понимаю ваш вопрос. Я думаю, что вы могли бы структурировать 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>
У меня нет большого опыта работы с иерархической DataTemplate, но вы получите суть от выше. Вы также можете сделать это со стилем, но у меня нет редактора xaml передо мной, чтобы дать вам правильный синтаксис.
Надеюсь, что поможет
Смежные вопросы
- 1. TreeView ContextMenu MVVM Binding
- 2. WPF Treeview contextmenu IsChecked binding MVVM
- 3. ContextMenu в MVVM
- 4. Treeview in ContextMenu
- 5. JavaFX 2.0 TreeView ContextMenu
- 6. ContextMenu Связывание с TreeView
- 7. Wpf Treeview Contextmenu DataContext
- 8. TreeView ContextMenu неработающие события
- 9. ContextMenu and TreeView
- 10. WPF: Добавить ContextMenu в TreeView
- 11. MVVM listbox item contextmenu
- 12. MVVM Listbox ContextMenu
- 13. WPF MVVM Dynamic ContextMenu
- 14. IsFocused в MVVM TreeView
- 15. MVVM Treeview Нажмите узел
- 16. WPF Binding ContextMenu для TextBlock в TreeView
- 17. WPF treeview contextmenu параметр команды
- 18. WPF Build ContextMenu динамически через MVVM
- 19. ContextMenu (CytoscapeJs против AngularJs)
- 20. Treeview MVVM ObservableCollection Updates
- 21. WPF MVVM Treeview
- 22. TreeView BringIntoView с MVVM
- 23. WPF MVVM TreeView Группы
- 24. MVVM treeview wpf (binding?)
- 25. TreeView ItemsSource MVVM Binding
- 26. mvvm navigation treeview
- 27. MVVM Treeview selected item
- 28. wpf treeview mvvm
- 29. Запуск кнопки MVVM WPF в ContextMenu on Return/Enter
- 30. Выполнение кода на ContextMenu в WPF MVVM
Когда у меня есть дерево hughe с большим количеством предметов, не создало бы тысячи контекстных меню? Разве это не проблема? Мне нужно только одно контекстное меню, которое изменяет его содержимое на основе текущего элемента. – bitbonk
Лично я бы не стал беспокоиться об этом, если вы не заметите удар производительности. Я сомневаюсь. Но другой выбор - иметь IEnumerable в вашем TreeView ViewModel, который динамически заполняется выбранным NodeViewModel. Но тогда вам нужно сохранить выбранный, чтобы вы могли заполнить его ICommands. Я не думаю, что сложность того стоит. –
Jose
Я не знаю, как печатают память для одного элемента управления MenuItem, но предположим, что это 1 КБ (что, вероятно, высоко), из них тысяча будет только 1 МБ. Я не думаю, что вам следует беспокоиться об этом. Плюс WPF, вероятно, ленивы загружает MenuItems в любом случае, поэтому, вероятно, только узлы, которые получают щелчок правой кнопкой, будут иметь память. – Jose