2010-10-13 9 views
4

ViewModel a 2 champ. Name, ChildsJ'ai besoin de l'arborescence Wpf comme ceci

J'ai besoin comme ça

1. Lorsque vous cliquez sur l'élément racine, effectuez 2 l'opération
first. Développez-vous
second. sélectionnez le premier enfant. Si l'élément enfant a des enfants, répétez 1.
autrement, ne rien

Seulement dernier enfant (feuille) sélectionnable

Répondre

-1

Qu'en est-il pour capturer l'événement de sélection de l'élément sur la TreeView et d'élargir le premier enfant de l'élément sélectionné? Cela semble facile à faire.

1

MISE À JOUR
Nous avons trouvé une bien meilleure façon de procéder. Cela va également tenir compte des changements dans ObservableCollection.

Le XAML peut simplement ressembler à ceci

<Window.Resources> 
    <HierarchicalDataTemplate x:Key="Level1" 
           ItemsSource="{Binding Path=Childs}"> 
     <TextBlock Text="{Binding Path=Name}"/> 
    </HierarchicalDataTemplate> 
</Window.Resources> 
<TreeView ItemsSource="{Binding}" 
      ...> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" /> 
      <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

Et nous gérer la propriété IsSelected dans le modèle/ViewModel à la place.

public class MyViewModel : INotifyPropertyChanged 
{ 
    private static MyViewModel s_lastSelectedTestItem = null; 

    public MyViewModel(string name) 
    { 
     Name = name; 
     m_isSelected = false; 
     Childs = new ObservableCollection<MyViewModel>(); 
     Childs.CollectionChanged += new NotifyCollectionChangedEventHandler(TestItems_CollectionChanged); 
    } 

    void TestItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (IsSelected == true && Childs.Count > 0) 
     { 
      Childs[0].IsSelected = true; 
      IsExpanded = true; 
     } 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 
    public ObservableCollection<MyViewModel> Childs 
    { 
     get; 
     set; 
    } 

    private bool m_isSelected; 
    public bool IsSelected 
    { 
     get 
     { 
      return m_isSelected; 
     } 
     set 
     { 
      m_isSelected = value; 
      if (m_isSelected == true) 
      { 
       if (s_lastSelectedTestItem != null) 
       { 
        s_lastSelectedTestItem.IsSelected = false; 
       } 
       s_lastSelectedTestItem = this; 
       if (Childs.Count > 0) 
       { 
        IsExpanded = true; 
        Childs[0].IsSelected = true; 
        m_isSelected = false; 
       } 
      } 
      OnPropertyChanged("IsSelected"); 
     } 
    } 

    private bool m_isExpaned; 
    public bool IsExpanded 
    { 
     get 
     { 
      return m_isExpaned; 
     } 
     set 
     { 
      m_isExpaned = value; 
      OnPropertyChanged("IsExpanded"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
}