Tengo un árbol de ViewModels que se muestra como un TreeView (utilizando HierarchicalDataTemplate). Cada instancia de ViewModel tiene diferentes comandos que se pueden ejecutar en ella, que de nuevo están expuestos como una lista de comandos ViewModels para cada elemento ViewModel. ¿Cómo puedo crear un único ContextMenu que se abre en el TreeViewItem que fue cliqueado a la derecha y que rellena sus comandos desde el elemento subyacente del comando ViewModels del modelo de ViewModel? Todo en una moda MVVM decente ...ContextMenu dinámico en TreeView frente a MVVM
6
A
Respuesta
3
Creo que entiendo su pregunta. Creo que se podría estructurar sus ViewModels así:
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;}
}
y luego en XAML
<TreeViewItem>
<TreeViewItem.ContextMenu Items={Binding CommandList}>
<ContextMenu.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding Name}" Command="{Binding}"/>
</DataTemplate>
</ContextMenu.ItemTemplate>
</TreeViewItem.ContextMenu>
</TreeViewItem>
no tengo mucha experiencia con DataTemplate jerárquica pero se obtiene la esencia de lo anterior. También puede hacer lo anterior con un estilo en el, pero no tengo un editor xaml delante de mí para darle la sintaxis correcta.
Espero que ayude
Cuestiones relacionadas
- 1. Visualización de entidades en TreeView usando MVVM
- 2. WPF: Vinculando un ContextMenu a un comando MVVM
- 3. WPF DataGrid: Enlace DataGridColumn visibilidad a ContextMenu MenuItems IsChecked (MVVM)
- 4. MVVM seleccionando un elemento treeview programmatically
- 5. Usando MVVM, ¿cómo puede un ContextMenu ViewModel encontrar el ViewModel que abrió el ContextMenu?
- 6. Acceso a ViewModel/DataConext dentro de ContextMenu
- 7. vaciado estático frente dinámico reparto
- 8. de varios niveles anidados TreeView con enlace dinámico en WPF
- 9. WPF MVVM Uso de comandos frente a controladores de eventos
- 10. Parámetros de mandato en ContextMenu en WPF
- 11. Alcance de Lisp común (dinámico frente a léxico)
- 12. Alcance dinámico - Encuadernación profunda frente a Encolado poco profundo
- 13. agregar imagen a treeView
- 14. Elementos ContextMenu y ContextMenu de diseño
- 15. ContextMenu en colocador Estilo
- 16. ContextMenu en WPF
- 17. Interfaz de usuario de menú dinámico MVVM vinculante con ViewModel
- 18. NUnit frente a MbUnit frente a MSTest frente a xUnit.net
- 19. Wpf - Contextmenu en TabItem Header
- 20. WPF: Cómo ocultar ContextMenu cuando están vacíos
- 21. iterador frente a referencia frente a puntero
- 22. De MVC a MVVM
- 23. Retraso RaiseCanExecuteChanged con ContextMenu
- 24. MVVM Encuadernación a InkCanvas
- 25. WPF contextmenu y ListView
- 26. WPF: personalizado + - en TreeView
- 27. Estilo ContextMenu predeterminado - WPF
- 28. C# - DatagridView y ContextMenu
- 29. TreeView recursivo en ASP.NET
- 30. HierarchicalDataTemplates en un TreeView
Cuando tengo un árbol hughe con muchos elementos ¿no crearía miles de contextmenus? ¿No sería eso un problema? Necesito solo un menú contextual que cambie su contenido en función del elemento actual. – bitbonk
Personalmente, no me preocuparía a menos que note un golpe de rendimiento. Dudo que lo haría. Pero otra opción es tener un IEnumerable en su TreeView ViewModel que se rellena dinámicamente con el Selected NodeViewModel. Pero luego necesita almacenar cuál se seleccionó para que pueda llenar sus ICommands. No creo que la complejidad valga la pena. –
Jose
No conozco la huella de memoria para un control de MenuItem, pero digamos que es 1KB (que probablemente sea alto) y mil de esos solo serían 1MB. No creo que debas preocuparte por eso. Además, WPF probablemente cargue los Elementos de menú de manera perezosa, por lo que probablemente solo los nodos que se presionen con el botón derecho tomarán memoria. – Jose