Выбор Treeviewitem в WPF - PullRequest
0 голосов
/ 27 мая 2009

У меня есть текстовое поле поиска для поиска элемента дерева и выбора его. Дочерние элементы в древовидной структуре загружены лениво.

Я хочу выбрать дочерние времена древовидной структуры, передаваемой в текстовом поле поиска.

как мне этого добиться?

Спасибо Sharath

Ответы [ 2 ]

0 голосов
/ 18 ноября 2010

Вот мой помощник, извлеките то, что вам нужно: PS. Я никогда не проверял метод ExpandAll.

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
0 голосов
/ 27 мая 2009

Есть хорошая информация о выборе элементов в TreeView здесь:

http://askernest.com/archive/2008/01/23/how-to-programmatically-change-the-selecteditem-in-a-wpf-treeview.aspx

и здесь:

http://www.codeproject.com/KB/WPF/TreeView_SelectionWPF.aspx

...