Ich habe eine Struktur von ViewModels als TreeView angezeigt (mit HierarchicalDataTemplate). Jede ViewModel-Instanz verfügt über verschiedene Befehle, die auf ihr ausgeführt werden können und die wiederum als eine Liste von ViewModel-Befehlen für jedes Element ViewModel verfügbar gemacht werden. Wie kann ich ein einzelnes ContextMenu erstellen, das bei dem TreeViewItem geöffnet wird, das mit der rechten Maustaste angeklickt wurde und das seine Befehle aus dem zugrunde liegenden Element ViewModels Befehl ViewModels-Liste auffüllt? Alles in einer anständigen MVVM Mode ...dynamisches ContextMenu in TreeView vs. MVVM
6
A
Antwort
3
Ich glaube, ich verstehe Ihre Frage. Ich denke, dass Sie Ihre Viewmodels wie diese Struktur könnte:
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;}
}
und dann in XAML
<TreeViewItem>
<TreeViewItem.ContextMenu Items={Binding CommandList}>
<ContextMenu.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding Name}" Command="{Binding}"/>
</DataTemplate>
</ContextMenu.ItemTemplate>
</TreeViewItem.ContextMenu>
</TreeViewItem>
Ich habe nicht viel Erfahrung mit hierarchischen Datatemplate haben, aber Sie den Kern aus der oben erhalten. Sie könnten das oben genannte auch mit einem Stil in der tun, aber ich habe keinen XAML-Editor vor mir, um Ihnen die richtige Syntax zu geben.
Hoffnung, die
hilft Wenn ich einen hughe Baum mit sehr vielen Posten haben würde, dass nicht Tausende von Kontextmenüs erstellen? Wäre das nicht ein Problem? Ich brauche nur ein Kontextmenü, das seinen Inhalt basierend auf dem aktuellen Element ändert. – bitbonk
Persönlich würde ich mir keine Sorgen machen, es sei denn, Sie bemerken einen Performance-Hit. Ich bezweifle es. Eine weitere Option ist ein IEnumerable in Ihrem TreeView ViewModel, das dynamisch mit dem Selected NodeViewModel gefüllt wird. Aber dann musst du speichern, welches ausgewählt ist, damit du seine ICommands füllen kannst. Ich denke nicht, dass die Komplexität es wert ist. –
Jose
Ich kenne den Speicherfußdruck für ein MenuItem Steuerelement nicht, aber sagen wir es ist 1KB (was wahrscheinlich hoch ist), tausend davon wären nur 1MB. Ich glaube nicht, dass Sie sich darum sorgen sollten. Außerdem lädt WPF wahrscheinlich die MenuItems auf jeden Fall, sodass wahrscheinlich nur die Knoten, die mit der rechten Maustaste geklickt wurden, Speicher belegen. – Jose