2010-11-22 17 views
1

Je crée dynamiquement un menu contextuel et les éléments de menu ont des enfants. La première fois, les sous-menus s'affichent, mais le second s'affiche uniquement après les menus parents. Le sous-menu enfant est dans la collection qui est liée au menu contextuel, ils n'apparaissent tout simplement pas.Liaison de sous-menu dynamique MVVM de MVF

VMMenuItems est une propriété dans mon modèle de vue et est

ObservableCollection<MenuItemViewModel> 

Chaque fois que les données du Listview change VMMenuItems est totalement reconstruit. Un sous-menu ajoute simplement un autre MenuItemViewModel aux enfants existants de MenuItemViewModel. Des idées sur la façon de faire fonctionner les sous-menus à chaque fois?

Le code

<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

oh, cela est en .Net 3.5 – mike

Répondre

2

Je ne devais pas utiliser un HierarchicalDataTemplate et tout mettre ici dans ContextMenu.ItemContainerStyle. Je ne sais pas pourquoi mon autre moyen n'a pas fonctionné (eh bien ça a marché la 1ère fois mais pas les autres). Peut-être que quelqu'un d'autre pourrait me dire pourquoi ça ne fonctionne pas ...

<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

Je suis encore nouveau pour moi-même et je ne sais pas pour vous, sans le tester ou exactement pourquoi, mais je crois qu'il doit faire avec le remplacement de la collection enfants avec un collection entièrement nouvelle. Je pense que cela nécessiterait une reconsolidation de la collection. Il vaudrait mieux que les articles soient ajoutés/retirés de la collection existante. Cela déclencherait les notifications de liaison appropriées. À l'heure actuelle, la liaison est à une instance particulière de cette collection qui est remplacée dans l'appel Children.set. J'espère que cela t'aides.

+0

Oh, et si vous avez besoin de mettre toute la collection, je pense que vous devez gérer La notification PropertyChanged pour la propriété Children indique dans le code derrière de la vue pour effectuer la reliaison. – brader24

+0

J'ai supprimé tous les éléments de la collection et de la sous-collection et j'ai rajouté les nouveaux objets MenuItemViewModel mais j'ai quand même obtenu le même résultat, pas de sous-menus pour la 2ème fois. – mike

+0

C'est comme quand la propriété change, elle ne voit que les changements de couche supérieure et non les sous-fils/enfants. Y a-t-il moyen de le forcer à parcourir récursivement toutes les collections? – mike