2010-04-06 11 views
0

J'ai un TreeView avec quelques objets qui lui sont liés, disons quelque chose comme ceci:objet lié WPF update notification

public class House 
    { 
     public List<Room> Rooms { get; set; } 
     public List<Person> People { get; set; } 

     public House() 
     { 
      this.Rooms = new List<Room>(); 
      this.People = new List<Person>(); 
     } 

     public void BuildRoom(string name) 
     { 
      this.Rooms.Add(new Room() { Name = name }); 
     } 

     public void DestroyRoom(string name) 
     { 
      this.Rooms.Remove(new Room() { Name = name }); 
     } 

     public void PersonEnter(string name) 
     { 
      this.People.Add(new Person() { Name = name }); 
     } 

     public void PersonLeave(string name) 
     { 
      this.People.Remove(new Person() { Name = name }); 
     } 
    } 

    public class Room 
    { 
     public string Name { get; set; } 
    } 

    public class Person 
    { 
     public string Name { get; set; } 
    } 

Le TreeView veille sur l'objet Maison, chaque fois qu'une pièce est construite/détruite ou une personne entre/sort, ma vue arborescente se met à jour pour montrer le nouvel état de la maison (j'ai omis quelques détails d'implémentation pour plus de simplicité). Ce que je veux c'est connaître le moment exact où cette mise à jour se termine, donc je peux faire quelque chose, le fait est que j'ai créé un indicateur de l'élément sélectionné, et quand quelque chose bouge, j'ai besoin de mettre à jour position, c'est la raison pour laquelle j'en ai besoin exactement quand l'arborescence est mise à jour. Faites-moi savoir si vous connaissez une solution à ce problème.

En outre, le code n'est pas parfait (DestroyRoom et PersonLeave), mais vous avez l'idée.

Merci!

+0

Ne serait-il plus facile d'avoir juste l'indicateur dans le cadre du modèle d'élément et de lier sa visibilité à IsSelected? Cela semble une approche plus naturelle que d'essayer de s'accrocher au cycle de dessin, mais je ne suis pas sûr de vos contraintes. – itowlson

+0

@itwolson: Nous pourrions, mais cela soulève quelques problèmes supplémentaires que nous avons déjà fixés dans celui-ci. Nous avons déjà passé quelques heures ici, et c'est le seul problème qui reste. Bien sûr, si nous ne pouvons pas le résoudre rapidement, nous devrons adopter une approche différente, ce qui sera probablement ce que vous avez suggéré. Merci! – Carlo

Répondre

0

Utilisez une ObservableCollection <T> et intégrez-la dans un CollectionView pour obtenir un CurrentItem pouvant être lié.

http://msdn.microsoft.com/en-us/library/system.windows.data.collectionview_members.aspx

+0

En fait, c'est ce que j'ai un ObservableCollection au lieu de listes, je n'aurais pas dû éviter ce détail. Quoi qu'il en soit, lorsque l'événement CollectionChanged se produit, l'arborescence n'a toujours pas mis à jour ses éléments, ce qui n'a pas fonctionné non plus. – Carlo

+0

Utilisez-vous un modèle de données hiérarchique? - Sinon, vous n'obtiendrez pas de sous-items. La propriété itemsSource de la vue arborescente est-elle correctement liée à la collection observable? (Essayez de lier le contenu d'une étiquette au compte de la collection et un autre à la collection pour tester cela - vous devriez obtenir un numéro dans l'un et le nom de la classe dans l'autre). –

Questions connexes