2010-07-14 5 views
0

J'ai un problème avec mon TreeView dans une application WPF (Framework 3.5 SP1). C'est un TreeVIew avec 2 niveaux de données. Je développe/réduit les éléments du premier niveau d'une manière particulière (avec un simple clic de souris sur le TreeViewItem). Encore une fois quand je développe un TreeViewItem de premier niveau, j'ajoute des TreeViewItems de second niveau au groupe (c'est un détail important, en fait, si je n'ajoute pas les éléments, le problème ne se produit pas). Tout fonctionne bien jusqu'à ce que le TreeView perd son focus. Si, par exemple, je développe le TreeViewItem à la première position, en ajoutant en même temps un élément au deuxième niveau, puis je clique sur un bouton (pour laisser le TreeView perdre le focus), puis je clique à nouveau sur le TreeViewItem à la troisième position pour l'agrandir, le TreeViewItem qui résulte du hit-test avec la position de la souris n'est pas le "vrai" TreeViewItem (dans ce cas le troisième), mais un TreeViewItem qui est dans une position plus élevée que celle cliqué (dans ce cas, le second). J'ai essayé d'utiliser la méthode UpdateLayout sur l'événement TreeView-LostFocus, mais sans résultats. Probablement j'ai besoin d'une méthode qui fait le contraire: à partir de l'interface utilisateur, actualisez l'objet qui contient la position de TreeViewItems. Pouvez-vous, s'il vous plaît, m'aider? Merci! PileggiWPF actualise TreeView lorsqu'il perd le focus

Voici le code:

' 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 

Répondre

0

Je trouve cette solution (mais je ne l'aime pas beaucoup). Le problème dépend des éléments ajoutés que wpf, pour certaines raisons, ne se souvient pas qu'il existe. Ensuite, je fais une actualisation "manuelle" avec une méthode qui efface et rajoute tous les éléments de la collection source:

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 
Questions connexes