2010-02-08 4 views
1

J'ai une exigence dans laquelle un menu devrait être implémenté comme une vue arborescente sur le côté gauche d'une fenêtre.Vue arborescente de WPF à utiliser comme menu (style MVVM)

Je sais comment remplir l'arborescence avec les données (menu) (la méthode mvvm).

Mais: comment connecter chaque objet de l'arborescence à un ICommand (dans le Viewmodel)? de sorte que par ex. double-cliquer sur un objet entraîne l'ouverture d'une fenêtre ??

Merci à l'avance

+3

Plutôt que de savoir comment faire un TreeView se comporte comme un menu, pourquoi ne pas utiliser un menu et utilisez templating personnalisé pour le présenter dans un TreeView -comme moyen? Dans WPF, il est généralement plus facile d'utiliser le contrôle avec le comportement souhaité et de modifier son apparence que d'utiliser le contrôle avec l'apparence désirée et de modifier son comportement. – itowlson

+0

je suis d'accord avec itowlson –

+0

+1 itowlson. Si vous voulez un menu qui ressemble à une arborescence, utilisez un menu et le style – Zied

Répondre

0

Je pense que ce problème devrait être résolu d'une autre manière, mais ...

  • vous auriez la commande sur votre modèle vue comme une propriété. Vous dérivez de treeview et treeview item.
  • Vous donnez l'élément TreeView une propriété de commande , vous liez cela la commande de modèle de votre vue dans les vues d'arbres ItemContainerStyle (en le XAML)
  • vous substituez la souris aperçu vers le bas sur l'arborescence élément à appelez la commande

ici est un exemple TreeViewItem

public class EditableTreeViewItem : TreeViewItem { 

     public ICommand DoubleClickCommand { 
     get { return (ICommand)GetValue(DoubleClickCommandProperty); } 
     set { SetValue(DoubleClickCommandProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for DoubleClickCommand. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty DoubleClickCommandProperty = 
      DependencyProperty.Register("DoubleClickCommand", typeof(ICommand), typeof(EditableTreeView), new UIPropertyMetadata(null)); 



     protected override void OnPreviewMouseDoubleClick(MouseButtonEventArgs e) { 

     if (this.DoubleClickCommand!= null) { 
      this.DoubleClickCommand.Execute(this.DataContext); 
      e.Handled = true; 
     } 
     base.OnPreviewMouseDoubleClick(e); 
     } 

     protected override DependencyObject GetContainerForItemOverride() { 
     return new EditableTreeViewItem(); 
     } 

     protected override bool IsItemItsOwnContainerOverride(object item) { 
     return item is EditableTreeViewItem; 
     } 
} 

et TreeView utiliser cet objet

public class EditableTreeView : TreeView { 

     //generate the tree view item 
     protected override DependencyObject GetContainerForItemOverride() { 
     EditableTreeViewItem item = new EditableTreeViewItem(); 
     return item; 
     } 

     protected override bool IsItemItsOwnContainerOverride(object item) { 
     return item is EditableTreeViewItem; 
     } 
} 

maintenant que certaines personnes intelligentes ont dit plus haut, vous seriez mieux à l'aide d'un menu et un style. maintenant, lorsque vous double-cliquez sur l'élément treeview, il appellera la commande au lieu d'étendre/réduire comme il se doit.

Voici comment vous utiliseriez dans le XAML

  <controls:EditableTreeViewMode=OneWayToSource}" 
      ItemsSource="{Binding Path=MyItemsSource}"> 
      <controls:EditableTreeView.ItemContainerStyle> 
       <!-- This Style binds a TreeViewItem to a the ViewModel. --> 
       <Style 
        TargetType="{x:Type controls:EditableTreeViewItem}"> 
        <Setter 
         Property="DoubleClickCommand" 
         Value="{Binding OpenNewWindowCommand}" /> 
       </Style> 
      </controls:EditableTreeView.ItemContainerStyle> 
      </controls:EditableTreeView> 
+0

... pour être honnête: jamais pensé à le faire de cette façon !! si j'ai utilisé une approche similaire dans d'autres domaines! Cela semble très intéressant et je vais essayer. Merci beaucoup d'avoir ouvert les yeux d'un homme aveugle! –

Questions connexes