У меня проблема с моим TreeView в приложении WPF (Framework 3.5 SP1). Это TreeView с двумя уровнями данных. Я расширяю/сворачиваю элементы первого уровня определенным образом (одним щелчком мыши по TreeViewItem). Опять же, когда я расширяю TreeViewItem первого уровня, я добавляю некоторые элементы TreeViewItems второго уровня в группу (это важная деталь, infact, если я не добавляю элементы, проблемы которых не возникают). Все работает хорошо, пока TreeView не теряет фокус. Если, например, я расширяю TreeViewItem в первой позиции, добавляя одновременно один элемент к второму уровню, затем я нажимаю кнопку (чтобы TreeView потерял фокус), а затем снова нажимаю TreeViewItem в третьей позиции для его расширения, TreeViewItem, полученный в результате теста на попадание мыши, не является «реальным» TreeViewItem (в данном случае третьим), а TreeViewItem, который находится на более высоком уровне, чем один щелкнул (в этом случае второй). Я попытался использовать метод UpdateLayout в событии TreeView-LostFocus, но без результатов. Возможно, мне нужен метод, который делает наоборот: начиная с пользовательского интерфейса, обновляйте объект, который содержит позицию TreeViewItems. Можете ли вы, пожалуйста, помочь мне? Спасибо! PileggiWPF обновляет TreeView, когда он теряет фокус
Это код:
' in this way I tried to put remedy at the problem, but it doesn't work.
Private Sub tvArt_LostFocus(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles tvArt.LostFocus
Me.tvArt.UpdateLayout()
e.Handled = True
End Sub
' here I expand/collapse the items of the first level of my TreeView
Private Sub tvArt_PreviewMouseUp(ByVal sender As System.Object, ByVal e As MouseButtonEventArgs) Handles tvArt.PreviewMouseUp
Dim p As Point = Nothing
Dim tvi As TreeViewItem = getItemFromMousePosition(Of TreeViewItem)(p, e.OriginalSource, Me.tvArt)
If tvi Is Nothing = False Then
If tvi.HasItems Then
Dim be As BindingExpression = BindingOperations.GetBindingExpression(tvi, TreeViewItem.ItemsSourceProperty)
Dim ri As P_RicambiItem = DirectCast(be.DataItem, P_RicambiItem)
If ri.isExpanded = False then
' here I add items to the second level collection
End If
ri.isExpanded = Not ri.isExpanded
End If
End If
e.Handled = True
End Sub
Private Function getItemFromMousePosition(Of childItem As DependencyObject)(ByRef p As Point, ByVal sender As UIElement, _
ByVal _item As UIElement) As childItem
p = sender.TranslatePoint(New Point(0, 0), _item)
Dim obj As DependencyObject = DirectCast(_item.InputHitTest(p), DependencyObject)
While obj Is Nothing = False AndAlso TypeOf obj Is childItem = False
obj = VisualTreeHelper.GetParent(obj)
End While
Return DirectCast(obj, childItem)
End Function