0

J'ai un MainViewModel qui contient une référence à un ObservableCollection:Reliure à ObservableCollection avec MVVM Lumière

public ObservableCollection<SomeClass> ListOfPeople 
{ 
    get 
    { 
     return MyClass.BaseCollection; 
    } 
} 

BaseCollection est aussi une instance de ObservableCollection<SomeClass>. ListOfPeople est lié à un contrôle ListBox sur la deuxième page - l'application commence par la première page, lance le processus de téléchargement pour remplir BaseCollection et passe à la deuxième page pendant que le téléchargement est en cours.

Le problème est que lorsque la liaison se produit, BaseCollection est nulle et par conséquent le ListBox n'est pas rempli. Cependant, même lorsque le processus de téléchargement se termine, le ListBox reste vide. Je suppose que cela se produit parce que BaseCollection ne notifie pas l'instance appropriée au sujet des changements existants à la collection, mais je ne suis pas sûr.

BaseCollection a des éléments à l'intérieur - je l'ai confirmé.

Des suggestions sur comment je peux contourner le problème? Quelqu'un ici se lier à une ObservableCollection via MVVM Light comme je l'ai montré ci-dessus?

Répondre

4

Si vous donot souhaitez instancier un ListOfPeople vide dans le constructeur et utiliser cette instance pour la base de données de chargement que vous devez faire ceci:

Après le chargement de ListOfPeople est terminée, votre MainViewModel doit appeler RaisePropertyChanged("ListOfPeople"); dire la vue que les données ont changé. Contexte: Grâce à ObservableCollection, MyClass.BaseCollection.Add() met à jour l'interface graphique. Dès que MyClass.BaseCollection = new Obser... est appelé, il n'y a plus de mise à jour du GUI puisque le GUI contient une référence à l'ancienne version de MyClass.BaseCollection. mvvm-light-RaisePropertyChanged() demande à l'interface graphique de mettre à jour sa référence à une nouvelle collection

+0

En fait travaillé comme un charme - après tout il y avait une nuance MVVM Light là-bas. Merci! –

+0

D'un autre côté, l'utilisateur devra attendre un certain temps jusqu'à ce qu'un élément apparaisse dans le ListBox. Aussi, pourquoi utiliseriez-vous ObservableCollection alors? Même en utilisant une simple liste <> et en faisant RaisePropertyChanged (..) lorsque vous avez terminé le téléchargement, vous ferez la même chose. –

+0

Vous avez sauvé ma journée aujourd'hui! – Signcodeindie

3

Je n'ai pas travaillé sur MVVM Light, donc désolé s'il y a quelque chose de spécifique à ce sujet qui me manque.

Regarder l'implémentation,

public ObservableCollection<SomeClass> ListOfPeople 
{ 
    get 
    { 
     return MyClass.BaseCollection; 
    } 
} 

Ce code devrait fonctionner, et le contrôle qui est binded à cette source devrait se PROPERT mise à jour sans se soucier de la source réelle où l'instance de observable est créé.

Ainsi, le seul problème possible ici pourrait être que votre MyBase.BaseCollection est null au début. Donc, si vous évitez cette situation et créez une collection vide où vous avez déclaré cet élément observable, puis déclenchez votre processus de téléchargement tel qu'il est, tout devrait fonctionner correctement.

Espérons que ce serait utile.

+0

Je suis d'accord avec la réponse @ Amby, j'ai juste besoin d'instancier la BaseCollection au niveau de la constellation MyClass pour résoudre ce problème. Et MVVMLight n'a rien à voir avec ce scénario de liaison. –

+0

MVVM Light était là à des fins de référence - en s'assurant simplement qu'il n'y a pas de nuances de mise en œuvre. La chose est - MyClass est statique, ce qui est bien - il y a un constructeur statique et je peux initialiser la collection avant de passer à la deuxième page (et donc de liaison). Au début, la collection est en effet nulle, mais même avec l'initialisation, elle ne semble pas avoir d'effet sur elle. –

Questions connexes