2010-03-24 38 views
6

TreeView (HierarchicalDataTemplate kullanarak) olarak görüntülenen bir ViewModels ağacı var. Her bir ViewModel örneğinde, her bir ViewModel öğesi için bir kez de ViewModels komutunun bir listesi olarak gösterilecek farklı komutlar vardır. Sağdan tıklatılmış TreeViewItem'de açılan ve komutlarını ViewModel'in komut görünümü olan ViewModels listesinden dolduran tek ContextMenu nasıl oluşturabilirim? Hepsi iyi bir MVVM moda ...treeView vs MVVM dinamik ContextMenu

cevap

3

Sanırım sorunuzu anlıyorum. Ben böyle senin ViewModels yapısı olabileceğini düşünüyorum:

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;} 
} 

ve sonra hiyerarşik datatemplate çok deneyimli olmayan xaml

<TreeViewItem> 
    <TreeViewItem.ContextMenu Items={Binding CommandList}> 
    <ContextMenu.ItemTemplate> 
     <DataTemplate> 
     <MenuItem Header="{Binding Name}" Command="{Binding}"/> 
     </DataTemplate> 
    </ContextMenu.ItemTemplate> 
    </TreeViewItem.ContextMenu> 
</TreeViewItem> 

ama yukarıdan yüreğin olsun. Yukarıdakileri de bir stil ile yapabilirdiniz ama size doğru sözdizimi vermek için önümde bir xaml düzenleyicisi yok.

Bu yardımcı olur umarım

+0

Çok sayıda öğe içeren bir kucaklama ağacım olduğunda, binlerce içerik menüsü oluşturmaz mı? Bu sorun olmaz mıydı? İçeriğini mevcut öğeye göre değiştiren bir bağlam menüsüne ihtiyacım var. – bitbonk

+0

Kişisel olarak, bir perfomance vuruşu fark etmedikçe bunun için endişelenmem. Bundan şüpheliyim. Ama başka bir seçim, Seçili NodeViewModel ile dinamik olarak doldurulan TreeView ViewModel'inizde bir IEnumerable 'a sahip olmaktır. Ama sonra hangisinin seçildiğini saklamanız gerekir, böylece ICommands'ı doldurabilirsiniz. Karmaşıklığın buna değeceğini sanmıyorum. – Jose

+0

Bir MenuItem denetimi için bellek ayağı baskısını bilmiyorum, ancak bunun 1 KB (muhtemelen yüksek olduğu) diyelim bunlardan bininin yalnızca 1 MB olacağını düşünelim. Bunun için endişelenmene gerek yok. Artı WPF muhtemelen tembel MenuItems yükler yükler, bu nedenle muhtemelen sadece sağ tıklanan düğümleri bellek alacak. – Jose