TreeView 为同一级别的每个项目添加不同的上下文菜单,WPF MVVM
TreeView add different context Menu to every item in the same level, WPF MVVM
在 this article 的帮助下,我使用 WPF 和 MVVM 创建了 TreeView。现在我想为一个级别中的每个项目添加不同的上下文菜单。
google 研究允许我为一个级别中的每个项目创建相同的上下文菜单。
所以我的问题是,您是否有任何想法允许我在完全尊重体系结构 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="/Images\RedCircle.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="/Images\RedCircle.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="/Images\GreenCircle.png" />
<TextBlock Text="{Binding ThirdLevelEntityName}" />
</StackPanel>
</DataTemplate>
<!-- End Level 3 -->
</TreeView.Resources>
您将 MenuItems 集合添加到您的视图模型并将 ContextMenu.ItemsSource 绑定到它:
示例:
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 的示例 here
希望,有帮助
在 this article 的帮助下,我使用 WPF 和 MVVM 创建了 TreeView。现在我想为一个级别中的每个项目添加不同的上下文菜单。 google 研究允许我为一个级别中的每个项目创建相同的上下文菜单。
所以我的问题是,您是否有任何想法允许我在完全尊重体系结构 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="/Images\RedCircle.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="/Images\RedCircle.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="/Images\GreenCircle.png" />
<TextBlock Text="{Binding ThirdLevelEntityName}" />
</StackPanel>
</DataTemplate>
<!-- End Level 3 -->
</TreeView.Resources>
您将 MenuItems 集合添加到您的视图模型并将 ContextMenu.ItemsSource 绑定到它:
示例:
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 的示例 here
希望,有帮助