2010-03-24 28 views
6

我有一個顯示爲TreeView(使用HierarchicalDataTemplate)的ViewModels樹。每個ViewModel實例都有不同的命令可以在其上執行,並且每個ViewModel項目都會顯示爲命令ViewModel的列表。我如何創建一個單個的 ContextMenu,它在右鍵單擊的TreeViewItem上打開,並從基礎項目ViewModel的命令ViewModels列表填充其命令?所有在一個體面的MVVM時尚...TreeView與MVVM中的動態ContextMenu

回答

3

我想我明白你的問題。我認爲你可以構造你的ViewModels這樣的:

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

,然後在XAML

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

我沒有與分層的DataTemplate太多的經驗,但你從上面的要點。你也可以用上面的樣式來完成上述操作,但是我沒有在我前面的xaml編輯器給你正確的語法。

希望有幫助

+0

當我有一個擁有大量項目的擁抱樹不會創建數以千計的contextmenus?這不是問題嗎?我只需要一個上下文菜單,根據當前項目更改其內容。 – bitbonk 2010-03-27 07:02:17

+0

就個人而言,除非您注意到性能受到影響,否則我不會擔心。我懷疑它會。但另一種選擇是在您的TreeView ViewModel中有一個IEnumerable ,該ViewView是使用Selected NodeViewModel動態填充的。但是,那麼你需要存儲哪一個選擇,所以你可以填充它的ICommands。我不認爲複雜性是值得的。 – Jose 2010-03-29 13:28:52

+0

我不知道一個MenuItem控件的內存足跡,但假設它是1KB(可能很高),其中一千個僅爲1MB。我不認爲你應該擔心。加上WPF可能會延遲加載MenuItems,所以可能只有右鍵單擊的節點纔會佔用內存。 – Jose 2010-03-29 13:31:55