WPF обновляет TreeView, когда теряет фокус

У меня проблема с моим TreeView в приложении WPF (Framework 3.5 SP1). Это TreeVIew с 2 уровнями данных. Я раскрываю / сворачиваю элементы первого уровня определенным образом (одним щелчком мыши на TreeViewItem). Опять же, когда я раскрываю TreeViewItem первого уровня, я добавляю в группу несколько элементов TreeViewIte второго уровня (это важная деталь, если я не добавлю элементы, проблема не возникнет). Все работает хорошо, пока TreeView не потеряет фокус. Если, например, я разверну TreeViewItem в первой позиции, добавив одновременно один элемент ко второму уровню, то я нажму на кнопку (чтобы TreeView потерял фокус), а затем я снова нажму на TreeViewItem в третьей позиции, чтобы развернуть его, TreeViewItem, который получается в результате проверки нажатия с помощью позиции мыши, является не "реальным" TreeViewItem (в данном случае третьим), а TreeViewItem, который находится в более высокой позиции, чем нажатый (в данном случае второй). Я пытался использовать метод UpdateLayout для события TreeView-LostFocus, но безрезультатно. Вероятно, мне нужен метод, который делает противоположное: начиная с пользовательского интерфейса, обновите объект, который содержит позицию TreeViewItems. Не могли бы вы мне помочь? Спасибо! Pileggi

Это код:

   ' 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

1 ответ

Решение

Я нашел это решение (но мне оно не очень нравится). Проблема в том, что в зависимости от добавленных элементов wpf по некоторым причинам не помнит, что они существуют. Затем я выполняю "ручное" обновление с помощью метода, который очищает и повторно добавляет все элементы в исходную коллекцию:

Public Sub RefreshData(ByVal RicambiListPass As ObservableCollection(Of P_RicambiItem))
    Dim l As New List(Of P_RicambiItem)
    l.AddRange(RicambiListPass)
    _RicambiList.Clear()
    For Each i As P_RicambiItem In l
        _RicambiList.Add(i)
    Next
End Sub
Другие вопросы по тегам