WPF TreeView lié à ObservableCollection pas de mise à jour des nœuds racine
Désolé, ma question est presque identique à cette une mais depuis, il n'a pas reçu une réponse viable, je suis en espérant que quelqu'un d'autre a des idées fraîches.
J'ai un WPF TreeView qui est lié à une hiérarchie d'un seul type:
public class Entity
{
public string Title { get; set; }
public ObservableCollection<Entity> Children { get; set; }
}
L'Entité de la classe implémente INotifyPropertyChanged, mais j'ai omis ce code pour plus de clarté.
Le TreeView est lié à une ObservableCollection<Entité>, et chaque instance d'Entité expose un ensemble de contenus instances d'Entité par l'intermédiaire de ses Enfants de la propriété:
<TreeView ItemsSource="{Binding Path=Entities}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Entity}" ItemsSource="{Binding Path=Children}">
<TextBlock Text="{Binding Path=Title}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
D'abord le TreeView lie comme prévu et d'afficher correctement un multi-niveau de la hiérarchie. Aussi, lorsque l'adhésion à l'un des Enfants des collections est modifié par programme, les modifications sont correctement prises en compte dans le contrôle TreeView.
Cependant, des changements à la composition de la racine au niveau des membres ObservableCollection<Entité> ne sont pas reflétées dans le TreeView.
Toutes les suggestions seraient appréciées.
Grâce,
Tim
OriginalL'auteur Tim Coulter | 2010-01-26
Vous devez vous connecter pour publier un commentaire.
Au départ, ma conjecture est que vous avez quelque chose comme ce qui suit pour le nœud racine:
Alors, au lieu de faire quelque chose de [bonne] comme suit:
Vous faites quelque chose de [bad] comme ceci:
Vous devriez être en mesure de suivre le problème en faisant de la sauvegarde champ des Entités de la propriété
readonly
:Wow, cela a fonctionné pour moi. Pourquoi ce changement?
Dans la [Mauvaise] exemple qu'il est la création d'une nouvelle entité, donc la rupture de la liaison à l'original. Dans la [bonne] exemple qu'il est juste de compensation et y ajouter des éléments, mais en gardant l'original de la collection.
Excellent exemple, m'a aidé avec mon Arborescence de répertoires de l'Arborescence
OriginalL'auteur Sam Harwell
De plus amples explications, le long temps de réponse, mais je crois que si vous faites la liaison dans le code XAML, et ensuite dans le code attribuer un nouvel objet à la propriété, vous casser la liaison, alors vous pourriez avoir à refaire la liaison dans le code pour qu'il fonctionne. Donc la solution avec le readonly champ de stockage. Si vous faites comme ça vous ne serez pas en mesure d'attribuer un nouveau ObservableCollection et vous ne serez pas rompre la liaison par l'affectation d'un nouvel objet pour la sauvegarde de champ.
OriginalL'auteur PerK