2009-07-25 8 views
0

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.

Répondre

0

Il semble que lorsque le havent de liaison a été exécuté lorsque l'exécution a atteint ItemsSource = "{Binding Path = Contacts, Mode = TwoWay}". Pouvez-vous vérifier si vous instanciez la collection dans le constructeur du ViewModel, parce que je sens au moment de la liaison que l'instance Contacts n'est pas définie (null)

+0

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

+0

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. –

+0

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

Questions connexes