2010-11-22 157 views
1

我在动态创建一个上下文菜单,菜单项有子项。 第一次出现子菜单,但在第二次和之后只显示父菜单。子子菜单位于绑定到上下文菜单的集合中,它们不会显示。WPF MVVM动态子菜单绑定问题

VMMenuItems在我看来是一个模型财产是

ObservableCollection<MenuItemViewModel> 

每次在ListView中的数据变化VMMenuItems被完全重建。 子菜单只是将另一个MenuItemViewModel添加到现有的MenuItemViewModel的子项。 有关如何使子菜单每次都能工作的任何想法?

代码

<Window.Resources>   
    <HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" 
           ItemsSource="{Binding Path=Children}"> 
     <ContentPresenter Content="{Binding Path=MenuText}" /> 
    </HierarchicalDataTemplate> 
</Window.Resources> 

<ListView.ContextMenu> 
     <ContextMenu ItemsSource="{Binding Path=VMMenuItems> 
      <ContextMenu.ItemContainerStyle> 
       <Style TargetType="{x:Type MenuItem}">          
       <Setter Property="Command" Value="{Binding Command}"/> 
        <Setter Property="CommandParameter" Value="{Binding MenuText}"/> 
          </Style> 
         </ContextMenu.ItemContainerStyle> 
        </ContextMenu>      
       </ListView.ContextMenu> 

public class MenuItemViewModel : ViewModel 
{ 
    public MenuItemViewModel() 
    { 
     Children = new ObservableCollection<MenuItemViewModel>(); 
    } 


    private string _menuText; 
    public string MenuText 
    { 

     get { return _menuText; } 

     set 
     { 
      _menuText = value; 
      OnPropertyChanged("MenuText"); 
     } 
    } 


    private bool _isEnabled; 
    public bool IsEnabled 
    { 
     get { return _isEnabled; } 

     set 
     { 
      _isEnabled = value; 
      OnPropertyChanged("IsEnabled"); 
     } 
    } 


    private ICommand _command; 
    public ICommand Command 
    { 
     get { return _command; } 

     set 
     { 
      _command = value; 
      OnPropertyChanged("Command"); 
     } 
    } 

    private ObservableCollection<MenuItemViewModel> _children; 
    public ObservableCollection<MenuItemViewModel> Children 
    { 
     get { return _children; } 

     set 
     { 
      _children = value; 
      OnPropertyChanged("Children"); 
     } 
    } 
+0

哦,这是在.net 3.5 – mike 2010-11-22 14:56:19

回答

2

我不得不使用HierarchicalDataTemplate并将它放在ContextMenu.ItemContainerStyle中。 我不知道为什么我的另一种方式不起作用(它是第一次,但没有任何其他)。 也许别人能告诉我为什么它不工作...

<ContextMenu.ItemContainerStyle> 
    <Style TargetType="{x:Type MenuItem}"> 
    <Setter Property="Header" Value="{Binding MenuText}"/> 
    <Setter Property="ItemsSource" Value="{Binding Path=Children}"/> 
    <Setter Property="Command" Value="{Binding Command}"/> 
    <Setter Property="CommandParameter" Value="{Binding MenuText}"/> 
    </Style> 
</ContextMenu.ItemContainerStyle> 
0

我还是新来此我自己,我不知道肯定没有测试它或到底为什么,但我相信这与用替换Children集合做全新的收藏品。我认为这需要重新收藏。将物品从现有集合中添加/删除会更好。这将触发适当的绑定通知。现在,绑定是针对在Children.set调用中被替换的该集合的特定实例。希望这可以帮助。

+0

哦,如果你需要设置的整个集合,我想你需要处理Children属性的PropertyChanged通知会在View的代码背后进行重新绑定。 – brader24 2010-11-23 13:24:32