2015-08-25 2 views
0

С помощью this article я создал TreeView с помощью WPF с MVVM. Теперь я хочу добавить другое контекстное меню для каждого элемента на одном уровне. Исследование google позволяет мне создавать одно и то же контекстное меню для каждого элемента на одном уровне.TreeView добавляет другой контекст Меню для каждого элемента на том же уровне, WPF MVVM

Итак, мой вопрос У вас есть идея, которая позволяет мне создавать контекстное меню для каждого элемента на одном уровне с полным уважением к архитектуре 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> 

ответ

2

Вы добавить коллекцию 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

Надежда, это помогает

+0

Заголовок и команды не существует в класс MenuItem !!! – xtensa1408

+1

Возможно, вы использовали класс MenuItem из winforms, управляющего библиотекой/пространством имен. Проверьте, что MenuItem - это тот, который вы ожидаете. Вы можете обнаружить, что эти свойства существуют в классе MenuItem, если вы google "wpf menuitem" – VMaleev

Смежные вопросы