TreeView添加不同的上下文菜单,每个项目在同一级别,WPF MVVM



在本文的帮助下,我使用WPF和MVVM创建了TreeView。现在我想在一个关卡中为每个项目添加不同的上下文菜单。一个谷歌研究允许我创建一个相同的上下文菜单,每个项目在一个级别。

所以我的问题是,你有什么想法,让我创建上下文菜单的每一个项目在同一水平,充分尊重MVVM的架构?

下面的代码允许我创建相同的上下文菜单,每个项目在一个级别:

<TreeView.Resources>
<!--  Begin Context Menu  -->                                  
<ContextMenu x:Key="TreeViewContextualMenuLevel2" >
    <MenuItem Command="{Binding AddLevelTwoCommand}" Header="Add"/>
</ContextMenu>
<ContextMenu x:Key="TreeViewContextualMenuLevel3" >
    <MenuItem Command="{Binding EditCommand}" Header="Edit" />
    <MenuItem Command="{Binding RemoveCommand}" Header="Remove " />
</ContextMenu>
<!--  End context Menu  -->
<!--  Begin Level 1 -->
<HierarchicalDataTemplate 
DataType="{x:Type local:FirstLevelViewModel}" 
ItemsSource="{Binding Children}" >
    <StackPanel Orientation="Horizontal">
        <Image Width="16" Height="16" Margin="3,0" Source="/ImagesRedCircle.png" />
        <TextBlock Text="{Binding DefEntity1Name}" />
    </StackPanel>
</HierarchicalDataTemplate>
 <!--  End Level 1  -->
<!--  Begin Level 2: Root  -->
<HierarchicalDataTemplate DataType="{x:Type local:SecondLevelViewModel}" ItemsSource="{Binding Children}">
    <StackPanel Orientation="Horizontal" ContextMenu="{StaticResource TreeViewContextualMenuLevel2}">
        <Image Width="16" Height="16" Margin="3,0" Source="/ImagesRedCircle.png" />
        <TextBlock Text="{Binding DefEntity2Name}" />
    </StackPanel>
</HierarchicalDataTemplate>
<!--  End Level 2: Root  -->
<!--  Begin Level 3  -->
<DataTemplate DataType="{x:Type local:ThirdLevelViewModel}">
    <StackPanel Orientation="Horizontal" ContextMenu="{StaticResource TreeViewContextualMenuLevel3}">
        <Image Width="16" Height="16" Margin="3,0" Source="/ImagesGreenCircle.png" />
        <TextBlock Text="{Binding ThirdLevelEntityName}" />
    </StackPanel>
</DataTemplate>
<!--  End Level 3  -->
</TreeView.Resources>

将菜单项集合添加到视图模型并绑定ContextMenu。条目来源:

的例子:

public class ViewModel
{
    public List<MenuItem> ContextMenuItems { get; set; }
    public ViewModel()
    {
        ContextMenuItems = new List<MenuItem>();
        ContextMenuItems .Add(new MenuItem() { Header = "item1", Command = new RelayCommand(() => { MessageBox.Show("Item 1 is clicked", "test", MessageBoxButton.OK, MessageBoxImage.Error); }) });
        ContextMenuItems.Add(new MenuItem() { Header = "item2", Command = new RelayCommand(() => { MessageBox.Show("Item 2 is clicked", "test", MessageBoxButton.OK, MessageBoxImage.Error); }) });
    }
}

在你的xaml资源中:

<ContextMenu x:Key="TreeViewContextualMenuLevel2" ItemsSource="{Binding ContextMenuItems}" />

因此,你可以根据条件为每个项目创建单独的上下文菜单

RelayCommand的例子可以在这里找到

希望能有所帮助

最新更新