2010-07-15 22 views
2

Im en utilisant la dernière version de boîte à outils de lumière MVVM, mais je ne suis pas clair comment je peux utiliser EventToCommand pour l'événement TreeViewItem.Expanded.TreeViewItem.Expanded

Ce travail dosent ... ce que je fais mal?

<TreeView Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path= MonitoredDatabases}"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Queues}"> 

       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding ServerName}" /> 
        <TextBlock Text="\" /> 
        <TextBlock Text="{Binding DatabaseName}" /> 
       </StackPanel> 

       <HierarchicalDataTemplate.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding QueueName}" /> 
        </DataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 

      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="TreeViewItem.Expanded"> 
       <cmd:EventToCommand Command="{Binding Path=NodeExpanded}" 
            CommandParameter="Expanded" /> 
      </i:EventTrigger> 
      <i:EventTrigger EventName="TreeViewItem.Collapsed"> 
       <cmd:EventToCommand Command="{Binding Path=NodeCollapsed}" 
            CommandParameter="Collapsed" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </TreeView> 

aide très appréciée.

Cordialement.

Gary

Répondre

0

L'événement pour commander le comportement est mis en oeuvre en tant que propriété ci-joint, qui doit être fixé à un FrameworkElement. Votre échantillon a la propriété attachée par Triggers attachée à TreeView qui n'a pas un événement développé ou réduit. Vous avez essayé d'utiliser « TreeViewItem.Expanded » comme le nom de l'événement, mais il ne fonctionne pas de cette façon.

Si vous créez vos TreeViewItems statiquement en XAML, ou manuellement dans le code-behind, vous pouvez attacher à chaque TreeViewItem. Malheureusement, je ne suis au courant d'aucun moyen de joindre à TreeViewItem à partir du HierarchicalDataTemplate. Vous pouvez lier au RelativeSource TemplatedParent, mais vous ne pouvez pas vous y attacher. Votre seule solution est de itérer les TreeViewItems dans le code-behind et gérer manuellement les événements, mais même alors vous auriez à le faire en utilisant le VisualTreeHelper seulement après que le contrôle TreeView a été données liées et rendus, ce qui est un énorme bidouille .

1

j'ai pu le faire en créant une coutume ItemContainerStyle pour la TreeView. Vous devriez être capable de mettre cela avec les extraits de code suivants.

1. A ViewModel pour le TreeView

public class TreeViewModelView 
{ 
    public IEnumerable<object> Values 
    { 
     get { /* return hierarchical data source here ... */ } 
    } 

    /// <summary> 
    /// Command executed when the TreeViewItem expanding event is raised. The data item is passed in as a parameter. 
    /// </summary> 
    public RelayCommand<object> ExpandedCommand 
    { 
     get { return new RelayCommand<object>(o => MessageBox.Show(o.GetType().Name)); } 
    } 

    /// <summary> 
    /// Command executed when the TreeViewItem collapsing event is raised. 
    /// </summary> 
    public RelayCommand CollapsedCommand 
    { 
     get { return new RelayCommand(() => MessageBox.Show("Collapsed")); } 
    } 

} 

2. Définir le TreeView et configurer les données requises liant:

<TreeView x:Name="lstItems" HorizontalAlignment="Left" Margin="21,19,0,80" Width="283" 
      DataContext="{DynamicResource TreeViewModelView}" 
      ItemsSource="{Binding Values, Mode=OneWay}" 
      ItemTemplate="{DynamicResource TreeViewDataTemplate}" 
      ItemContainerStyle="{DynamicResource TreeViewItemStyle}"> 
    <TreeView.Resources> 
     <mv:TreeViewModelView x:Key="TreeViewModelView" /> 

     <HierarchicalDataTemplate x:Key="TreeViewDataTemplate" ItemsSource="{Binding Items}"> 
      <Grid> 
       <TextBlock Text="{Binding Name}" /> 
      </Grid> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

3. Dans Expression vous mélange peut créer éditent une copie du ItemContainerStyle modèle

<Style x:Key="TreeViewItemStyle" TargetType="{x:Type TreeViewItem}"> 

    ... 

</Style> 

4. remplacez le ToggleButton avec:

<ToggleButton x:Name="Expander" ClickMode="Press" IsChecked="{Binding IsExpanded, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ExpandCollapseToggleStyle}"> 

    <i:Interaction.Triggers> 
     <!-- When the Checked event is raised execute the ExpandedCommand with the data item as a parameter. --> 
     <i:EventTrigger EventName="Checked"> 
      <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Path=DataContext.ExpandedCommand, RelativeSource={RelativeSource AncestorType={x:Type TreeView}}, Mode=OneWay}" 
       CommandParameter="{Binding}" /> 
     </i:EventTrigger> 
     <!-- When the Unchecked event is raised execute the CollapsedCommand. --> 
     <i:EventTrigger EventName="Unchecked"> 
      <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Path=DataContext.CollapsedCommand, RelativeSource={RelativeSource AncestorType={x:Type TreeView}}, Mode=OneWay}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 

</ToggleButton>