2010-08-28 25 views
0

J'essaie de faire quelque chose de similaire à ce que la personne dans this voulait faire.Existe-t-il un moyen de lier une commande à l'événement replié de tous TreeViewItems dans une arborescence?

Y at-il , plus élégant, façon de faire que la solution de rechange suggérée là-bas?

(en dernier recours) Existe-t-il un autre environnement mvvm qui aurait un meilleur support pour cela?

En ce moment je suis en train de faire un contrôle personnalisé qui hérite de la vue arborescente, comme ceci:

public ModdedTreeView() 
    { 
     this.AddHandler(TreeViewItem.CollapsedEvent, new RoutedEventHandler(ItemCollapsed)); 
    } 

public RelayCommand<RoutedEventArgs> ItemCollapsedCommand 
    { 
     get { return (RelayCommand<RoutedEventArgs>)GetValue(ItemCollapsedCommandProperty); } 
     set { SetValue(ItemCollapsedCommandProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ItemCollapsedCommand. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ItemCollapsedCommandProperty = 
     DependencyProperty.Register("ItemCollapsedCommand", typeof(RelayCommand<RoutedEventArgs>), typeof(ModdedTreeView), new UIPropertyMetadata(null)); 

protected void ItemCollapsed(object sender, RoutedEventArgs e) 
    { 
     if (ItemCollapsedCommand != null) 
      ItemCollapsedCommand.Execute(e); 
    } 

je puis lier la commande que je veux tirer, à la propriété ItemCollapsedCommand dépendance. Cependant, même cela ne fonctionne pas.

Je continue d'obtenir un InvalidOperationException: "Le traitement Dispatcher a été suspendu, mais les messages sont en cours de traitement."

Des idées?

Répondre

1

Je n'ai pas utilisé la classe "EventToCommand" décrite dans le lien que vous avez référencé. Mais essayez celui dans ce post: http://sachabarber.net/?p=514. Je viens d'écrire un petit échantillon en utilisant la classe CommandBehavior dans ce poste et j'ai pu joindre une commande à l'événement isCollapsed du TreeViewItem avec le XAML suivant:

<TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem"> 
      <Setter Property="local:CommandBehavior.TheCommandToRun" Value="{Binding MyCommand}"/> 
      <Setter Property="local:CommandBehavior.RoutedEventName" Value="Collapsed"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 

    <TreeViewItem Header="Item"> 
     <TreeViewItem Header="Item"> 
      <TreeViewItem Header="Item"/> 
     </TreeViewItem> 
    </TreeViewItem> 
</TreeView>