2009-05-27 15 views
0

Ich habe ein Such-Textfeld, um das TreeViewitem zu durchsuchen und es auszuwählen. Die untergeordneten Elemente in der Baumansicht sind faul geladen.Auswählen von TreeViewitem in WPF

Ich möchte die Child-Zeiten einer Treeview in Such-Textbox übergeben.

Wie kann ich das erreichen?

Dank Sharath

Antwort

0

Hier ist mein Helfer, Extrakt Was Sie brauchen: PS. Ich habe die ExpandAll-Methode nie getestet.

Imports System.Runtime.CompilerServices 
Imports System.Windows.Controls.Primitives 

<HideModuleName()> 
Module TreeViewHelper 

    <Extension()> 
    Public Sub SetSelectedItem(ByVal treeView As TreeView, ByVal item As Object) 
    SetSelectedItemInternal(treeView, item) 
    End Sub 
    <Extension()> 
    Public Sub SetSelectedItem(ByVal treeViewItem As TreeViewItem, 
          ByVal item As Object) 
    SetSelectedItemInternal(treeViewItem, item) 
    End Sub 
    Private Sub SetSelectedItemInternal(ByVal control As ItemsControl, 
             ByVal item As Object) 
    ValidateItemsControl(control) 
    If item Is Nothing Then Throw New ArgumentNullException("item") 
    If Not control.Items.Contains(item) Then _ 
     Throw New ArgumentOutOfRangeException("item", 
     "Specified item was not found in the control.") 

    If control.ItemContainerGenerator.Status = 
     GeneratorStatus.ContainersGenerated Then 

     DirectCast(control.ItemContainerGenerator.ContainerFromItem(item), 
     TreeViewItem).IsSelected = True 
    Else 
     Dim selectWhenReadyMethod As EventHandler 

     selectWhenReadyMethod = 
     Sub(sender, e) 
      If control.ItemContainerGenerator.Status = 
      GeneratorStatus.ContainersGenerated Then 
      RemoveHandler control.ItemContainerGenerator.StatusChanged, 
       selectWhenReadyMethod 

      SetSelectedItemInternal(control, item) 
      End If 
     End Sub 
     AddHandler control.ItemContainerGenerator.StatusChanged, 
     selectWhenReadyMethod 
    End If 
    End Sub 

    <Extension()> 
    Public Sub SetSelectedIndex(ByVal treeView As TreeView, ByVal index As Object) 
    SetSelectedIndexInternal(treeView, index) 
    End Sub 
    <Extension()> 
    Public Sub SetSelectedIndex(ByVal treeViewItem As TreeViewItem, 
           ByVal index As Object) 

    SetSelectedIndexInternal(treeViewItem, index) 
    End Sub 
    Private Sub SetSelectedIndexInternal(ByVal control As ItemsControl, 
             ByVal index As Object) 

    ValidateItemsControl(control) 

    If index < 0 OrElse index > control.Items.Count - 1 Then _ 
     Throw New ArgumentOutOfRangeException("index") 

    If control.ItemContainerGenerator.Status = 
     GeneratorStatus.ContainersGenerated Then 

     DirectCast(control.ItemContainerGenerator.ContainerFromIndex(index), 
     TreeViewItem).IsSelected = True 

    Else 
     Dim selectWhenReadyMethod As EventHandler 

     selectWhenReadyMethod = 
     Sub(sender, e) 
      If control.ItemContainerGenerator.Status = 
      GeneratorStatus.ContainersGenerated Then 
      RemoveHandler control.ItemContainerGenerator.StatusChanged, 
       selectWhenReadyMethod 

      SetSelectedIndexInternal(control, index) 
      End If 
     End Sub 
     AddHandler control.ItemContainerGenerator.StatusChanged, 
     selectWhenReadyMethod 
    End If 
    End Sub 

    <Extension()> 
    Public Sub ExpandAll(ByVal treeView As TreeView) 
    ExpandAllInternal(treeView) 
    End Sub 
    <Extension()> 
    Public Sub ExpandAll(ByVal treeViewItem As TreeViewItem) 
    ExpandAllInternal(treeViewItem) 
    End Sub 
    Private Sub ExpandAllInternal(ByVal control As ItemsControl) 
    ValidateItemsControl(control) 

    If control.Items.IsEmpty Then Exit Sub 

    If control.ItemContainerGenerator.Status = 
     GeneratorStatus.ContainersGenerated Then 

     For i = 0 To control.Items.Count - 1 
     Dim item = 
      DirectCast(control.ItemContainerGenerator.ContainerFromIndex(i), 
      TreeViewItem) 

     item.IsExpanded = True 
     ExpandAllInternal(control) 
     Next 
    Else 
     Dim expandWhenReadyMethod As EventHandler 

     expandWhenReadyMethod = 
     Sub(sender, e) 
      If control.ItemContainerGenerator.Status = 
      GeneratorStatus.ContainersGenerated Then 
      RemoveHandler control.ItemContainerGenerator.StatusChanged, 
       expandWhenReadyMethod 

      ExpandAllInternal(control) 
      End If 
     End Sub 
     AddHandler control.ItemContainerGenerator.StatusChanged, 
     expandWhenReadyMethod 
    End If 
    End Sub 

    Private Sub ValidateItemsControl(ByVal control As ItemsControl) 
    If control Is Nothing Then Throw New ArgumentNullException("control") 
    If Not TypeOf control Is TreeView AndAlso 
     Not TypeOf control Is TreeViewItem Then _ 
     Throw New _ 
     NotSupportedException(control.GetType.FullName & " is not supported.") 
    End Sub 

End Module 
Verwandte Themen