2010-10-13 54 views
4

ViewModel有2個字段。 NameChilds我需要這樣的Wpf樹視圖

我需要這樣的

1。當點擊根元素時,執行2操作
first。擴大自己
second。選擇第一個孩子。如果子元素有孩子,請重複1
否則什麼也不做

只有最後一個子(葉)可選

回答

-1

什麼對樹狀捕捉選擇項事件並展開所選項目的第一個孩子?這似乎很容易做到。

1

UPDATE
想出一個更好的方法來做到這一點。這也將解釋ObservableCollection中的變化。

XAML中可以只是看起來像這樣

<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> 

然後我們處理IsSelected屬性在模型/視圖模型來代替。

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)); 
     } 
    } 
}