2010-11-22 76 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