Question

Celui-ci est assez complexe, je l'espère, je peux faire ce assez clair pour que quelqu'un me aider. J'ai un objet permet d'appeler un gestionnaire, le gestionnaire a une collection de personnes qu'il gère, les gens mettre en œuvre tous 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 nœud de gestionnaire, je veux montrer tous les projets qu'il gère qui peut être déterminée à partir des personnes qu'il dirige.

Donc, le plan est d'utiliser un convertisseur pour convertir une personne en une liste de projets. Voici le XAML:

<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 INotifyCollectionChanged.This implémente le code fonctionne très bien quand je mets le treeview ItemsSource, les gestionnaires sont affichés avec leur liste de projets.

Cependant, quand j'ajoute une nouvelle personne à la liste des personnes, le TreeView est pas mis à jour. Quand je debug, je peux voir que le CollectionChanged est mise à feu avec l'action Ajouter et l'élément ajouté. En outre l'événement CollectionChanged est non nul, donc je sais que l'interface utilisateur le regarde. Mais le convertisseur n'exécute pas lorsque l'élément est ajouté.

Voici 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 le databinding?

Quelles autres choses puis-je vérifier?

Le convertisseur regarde juste chaque élément dans la liste des personnes et des chiffres sur quels projets ils travaillent et ajoute le nom du projet à une liste de sortie.

Était-ce utile?

La solution

Le convertisseur est appliqué à la propriété qui stocke la collection. Par conséquent, il ne sera appelée que si l'instance de collection elle-même change (pas si les éléments de la collection sont modifiés). Une façon de contourner ce serait d'invalider la collection quand vous le voulez rafraîchir.

La façon la plus simple d'invalider la propriété de collecte et de provoquer le code de conversion à courir serait de null la collecte et le réattribuer. Une autre façon est d'obtenir le BindingExpression ( par BindingOperations ) et appelez UpdateTarget . Enfin, vous pouvez lier la place à un CollectionView (ou sous-classe de celui-ci) et appeler Refresh dessus.

Et si vous vraiment veulent 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top