2013-10-08 24 views

回答

0

一種可能的方法是改變您與TreeView s的工作方式。使用數據綁定來控制選擇和擴展。這樣WPF將爲你做所有的工作。

  • 創建每個樹節點視圖模型,並添加IsSelectedIsExpanded性能
  • 使用ItemContainerStyleTreeViewItem小號綁定到它:

    <TreeView.ItemContainerStyle> 
         <Style TargetType="TreeViewItem"> 
          <Setter Property="IsExpanded" 
            Value="{Binding IsExpanded, Mode=TwoWay}" /> 
          <Setter Property="IsSelected" 
            Value="{Binding IsSelected, Mode=TwoWay}" /> 
         </Style> 
        </TreeView.ItemContainerStyle> 
    
  • 現在,您可以編寫代碼即操縱樹的數據,綁定將完成剩下的工作。

這裏的一個通用Node<T>視圖模型和用於搜索匹配的值,沿途擴大和選擇節點的第一個節點的遞歸方法的一個例子:

class Node<T> : INotifyPropertyChanged // should implement this properly on all properties for binding to work 
    { 
     public bool IsExpanded { get; set; } 
     public bool IsSelected { get; set; } 

     public T Value { get; set; } 

     public ObservableCollection<Node<T>> Children { get; } 
    } 

    bool TryFindNode<T>(Node<T> node, T value) 
    { 
     bool wasFound = false; 

     if (Equals(node.Value, value)) 
     { 
      node.IsExpanded = true; 
      node.IsSelected = true; 
      wasFound = true; 
     } 
     else 
     { 
      foreach (var childNode in node.Children) 
      { 
       if (SearchNode(childNode, searchText)) 
       { 
        node.IsExpanded = true; 
        wasFound = true; 
        break; 
       } 
      } 
     } 

     return wasFound; 
    } 
相關問題