2010-03-24 16 views
6

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

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

+0

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

+0

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

+0

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

Cuestiones relacionadas