我想我明白你的問題。我認爲你可以構造你的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編輯器給你正確的語法。
希望有幫助
當我有一個擁有大量項目的擁抱樹不會創建數以千計的contextmenus?這不是問題嗎?我只需要一個上下文菜單,根據當前項目更改其內容。 – bitbonk 2010-03-27 07:02:17
就個人而言,除非您注意到性能受到影響,否則我不會擔心。我懷疑它會。但另一種選擇是在您的TreeView ViewModel中有一個IEnumerable,該ViewView是使用Selected NodeViewModel動態填充的。但是,那麼你需要存儲哪一個選擇,所以你可以填充它的ICommands。我不認爲複雜性是值得的。 –
Jose
2010-03-29 13:28:52
我不知道一個MenuItem控件的內存足跡,但假設它是1KB(可能很高),其中一千個僅爲1MB。我不認爲你應該擔心。加上WPF可能會延遲加載MenuItems,所以可能只有右鍵單擊的節點纔會佔用內存。 – Jose 2010-03-29 13:31:55