J'ai une arborescence de ViewModels affichée sous forme de TreeView (en utilisant HierarchicalDataTemplate). Chaque instance de ViewModel a différentes commandes qui peuvent être exécutées et qui sont de nouveau exposées sous la forme d'une liste de commandes ViewModels pour chaque élément ViewModel. Comment puis-je créer un ContextMenu single qui s'ouvre sur TreeViewItem qui a été cliqué à droite et qui remplit ses commandes à partir de la liste ViewModels de la commande ViewModel sous-jacente? Tout d'une manière MVVM décent ...ContextMenu dynamique dans TreeView par rapport à MVVM
6
A
Répondre
3
Je pense avoir compris votre question. Je pense que vous pouvez structurer vos ViewModels comme ceci:
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;}
}
puis en XAML
<TreeViewItem>
<TreeViewItem.ContextMenu Items={Binding CommandList}>
<ContextMenu.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding Name}" Command="{Binding}"/>
</DataTemplate>
</ContextMenu.ItemTemplate>
</TreeViewItem.ContextMenu>
</TreeViewItem>
Je n'ai pas beaucoup d'expérience avec DataTemplate hiérarchique mais vous obtenez l'essentiel de ce qui précède. Vous pouvez également faire ce qui précède avec un style dans le mais je n'ai pas d'éditeur xaml devant moi pour vous donner la bonne syntaxe.
Hope qui aide
Quand j'ai un arbre hughe avec beaucoup d'articles ne serait pas que créer des milliers de contextmenus? Ce ne serait pas un problème? J'ai juste besoin d'un menu contextuel qui change son contenu en fonction de l'élément actuel. – bitbonk
Personnellement, je ne m'inquiéterais pas à moins que vous ne remarquiez un coup de performance. J'en doute. Mais un autre choix est d'avoir un IEnumerable dans votre TreeView ViewModel qui est rempli dynamiquement avec le Selected NodeViewModel. Mais alors vous devez stocker celui qui est sélectionné afin que vous puissiez remplir ses ICommands. Je ne pense pas que la complexité en vaille la peine. –
Jose
Je ne connais pas l'empreinte de la mémoire pour un contrôle MenuItem, mais disons que c'est 1KB (ce qui est probablement élevé), un millier d'entre eux ne serait que de 1 Mo. Je ne pense pas que tu devrais t'inquiéter à ce sujet. Plus WPF probablement paresseux charge les MenuItems de toute façon, donc probablement que les nœuds qui obtiennent un clic droit prendra de la mémoire. – Jose