Je lie un objet (nommé Client) avec la propriété ObservableCollection (nommée Contacts) à ma vue Silverlight. La classe My Client a quelques propriétés de chaîne sur is et l'objet ObservalbeCollection appelé Contacts. Il y a une propriété sur mon viewmodel nommé Client (qui implémente INotifyPropertyChanged) qui contient l'objet Client. Si je lie ListBox à mon avis à l'ObervableCollection sur l'objet comme celui-ci:Rendre les propriétés ViewModel visibles à la liaison dans Silverlight
ItemsSource = "{Binding Path = Client.Contacts, mode = TwoWay}"
et ajoutez un élément de contact à la collecte, la vue est mise à jour correctement et on me montre mon nouveau contact. Tout cela fonctionne très bien.
Si je crée une propriété de contacts sur ViewModel comme ce ObservableCollection publics Contacts {{ obtenir Client.Contacts de retour; } et lier la zone de liste à
ItemsSource = "{Binding Path = Contacts, Mode = TwoWay}"
la vue est jamais mis à jour.
J'ajouter l'élément de contact au client comme ceci:
Client.Contacts.Add (newContact)
Pourquoi ne pas le ListBox de contacts mise à jour? Comment puis-je changer cela pour que ça le fasse? La liaison Client.Contacts est-elle OK à utiliser? Mettre une pause dans le code après avoir ajouté le nouveau contact montre que le nouvel objet Contact est ajouté à la collection mais que la vue ne voit pas l'ajout.
J'ai résolu le problème que j'avais. Lorsque vous ajoutez l'élément à la collection comme ceci: Client.Contacts.Add (nouveauContact) La liaison n'est jamais notifiée de la modification de la propriété sous-jacente. Ainsi, pour que la liaison sache que j'ai mis à jour l'une de ses propriétés, j'ai déclenché l'événement PropertyChanged pour la propriété Contact et maintenant la liaison est notifiée. Dans mon cas, ItemsSource peut être lié à la propriété Contacts et répondre aux modifications. Merci pour votre aide! – DaveB
Mais je vois un hit de performance dans cette solution que vous avez décrite. Pour chaque ajout/suppression de collection, vous déclenchez un événement propertychanged qui provoque la reconstruction de ses éléments par ItemsControl - je pense que c'est une mauvaise idée. Plutôt, la méthode habituelle consiste à lever INotifyCollectionChanged (qui est intégré à ObservableCollection) et à laisser la propriété ItemsControl créer uniquement un Visual pertinent pour l'élément au lieu de tout recréer. –
L'utilisation d'une variable de sauvegarde pour la collection et l'ajout et la suppression d'éléments à partir de cette variable provoquent-elles toujours le déclenchement de l'événement propertychanged? – DaveB