2009-04-01 8 views
3

Celui-ci est assez complexe, j'espère que je peux le rendre assez clair pour que quelqu'un puisse m'aider. J'ai un objet permet de l'appeler un gestionnaire, le gestionnaire a une collection de personnes qu'il gère, tous les gens implémentent IPerson, mais différents types de personnes ont des propriétés différentes. Je veux afficher ce gestionnaire dans un arbre, et sous le noeud de gestionnaire je veux montrer tous les projets qu'il gère qui peuvent être déterminés par les personnes qu'il gère. Donc, le plan est d'utiliser un convertisseur pour convertir une personne en une liste de projets. Voici le XAML:ItemsSource + Converter + Treeview ne mettra pas à jour

<HierarchicalDataTemplate DataType="{x:Type ui:Manager}"> 
    <TextBlock Text="{Binding Path=Name}"/> 
    <HierarchicalDataTemplate.ItemTemplate> 
     <DataTemplate> 
        <TextBlock Text="{Binding}"/> 
     </DataTemplate> 
    </HierarchicalDataTemplate.ItemTemplate> 
    <HierarchicalDataTemplate.ItemsSource> 
     <Binding Path="People"> 
      <Binding.Converter> 
       <configUtil:ProjectListConverter/> 
      </Binding.Converter> 
     </Binding> 
    </HierarchicalDataTemplate.ItemsSource> 
</HierarchicalDataTemplate> 

Ma classe Person permet INotifyPropertyChanged, et la liste des personnes tenant en œuvre fonctionne INotifyCollectionChanged.This Code grand quand je mets le treeview ItemsSource, les gestionnaires sont affichés avec leur liste de projets.

Toutefois, lorsque j'ajoute une nouvelle personne à la liste de personnes, le TreeView n'est pas mis à jour. Quand je débogue, je peux voir que le CollectionChanged tire avec l'action Ajouter et l'élément ajouté. Aussi l'événement CollectionChanged n'est pas nul, donc je sais que l'interface utilisateur le regarde. Mais le convertisseur ne s'exécute pas lorsque l'élément est ajouté.

ici est la méthode Add pour la liste contenant les objets IPerson:

public void Add(T item) 
{ 
    list.Add(item); 
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item)); 
} 

Suis-je casser en quelque sorte la liaison de données?

Quelles sont les autres choses que je peux vérifier? Le convertisseur regarde juste chaque article dans la liste de personnes et détermine sur quels projets ils travaillent dessus et ajoute le nom de projet à une liste de rendement.

Répondre

2

Le convertisseur est appliqué à la propriété qui stocke la collection. Par conséquent, il ne sera appelé que si l'instance de collection elle-même change (pas si les éléments de la collection sont modifiés). Un moyen de contourner ce serait d'invalider la collection lorsque vous voulez l'actualiser.

La méthode la plus simple pour invalider la propriété de collection et provoquer l'exécution du code du convertisseur serait de null sur la collection et de la réaffecter. Une autre façon est d'obtenir le BindingExpression (via BindingOperations) et appelez UpdateTarget. Enfin, vous pouvez à la place vous lier à un CollectionView (ou à une de ses sous-classes) et appeler le Refresh.

Et si vous voulez vraiment pour résoudre le problème proprement, vous pouvez lier à votre propre implémentation de ICollectionView qui fait le filtrage et déclenche des événements si nécessaire.

+0

Je pense comprendre ce que vous me dites de faire, mais je ne suis pas sûr de savoir comment faire avec le hierarcicalDataTemplate. Si je comprends bien, je veux envelopper la propriété People dans un CollectionView, et actualiser le CollectionView lorsque la collection change. Un exemple de code serait une aide précieuse. – Kelly

+0

Merci pour l'aide, je l'ai eu en travaillant en enveloppant ma liste de personnes dans un ObservableCollection de projets qui ont souscrit à la collection de personnes changé l'événement et mis à jour lui-même. – Kelly

Questions connexes