2010-07-14 2 views
0

У меня проблема с моим 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 

ответ

0

меня найти это решение (но я не очень нравится). Проблема зависит от добавленных элементов, которые 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 
Смежные вопросы