Связывание с ObservableCollection с помощью MVVM Light - PullRequest
0 голосов
/ 12 марта 2011

У меня есть MainViewModel, который содержит ссылку на ObservableCollection:

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

BaseCollection также является экземпляром ObservableCollection<SomeClass>. ListOfPeople привязан к ListBox элементу управления на второй странице - приложение запускается с первой страницы, запускает процесс загрузки для заполнения BaseCollection и переключается на вторую страницу, пока загрузка еще продолжается.

Проблема заключается в том, что при связывании BaseCollection является нулевым и, следовательно, ListBox не заполняется. Однако даже после завершения процесса загрузки ListBox все еще остается пустым. Я предполагаю, что это происходит, потому что BaseCollection не уведомляет надлежащий экземпляр о существующих изменениях в коллекции, но я не уверен.

BaseCollection содержит предметы внутри - я это подтвердил.

Любые предложения о том, как я могу обойти эту проблему? Кто-нибудь здесь связывает ObservableCollection через MVVM Light, как я показал выше?

Ответы [ 2 ]

4 голосов
/ 12 марта 2011

Если вы не хотите создавать экземпляр пустого ListOfPeople в конструкторе и использовать этот экземпляр для загрузки базы данных, вы должны сделать это:

После завершения загрузки ListOfPeople ваш MainViewModel должен вызвать RaisePropertyChanged("ListOfPeople");, чтобы сказать, что данные изменились.

Справочная информация: благодаря ObservableCollection MyClass.BaseCollection.Add() обновляет графический интерфейс. Как только вызывается MyClass.BaseCollection = new Obser..., обновление графического интерфейса больше не выполняется, поскольку в графическом интерфейсе хранится ссылка на старый аргумент MyClass.BaseCollection. mvvm-light-RaisePropertyChanged () говорит графическому интерфейсу обновить ссылку на новую коллекцию

3 голосов
/ 12 марта 2011

Я не работал над MVVM Light, поэтому извините, если есть что-то конкретное в нем, которого мне не хватает.

Глядя на вашу реализацию,

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

Этот код должен работатьи элемент управления, связанный с этим источником, должен обновлять свойства, не заботясь о фактическом источнике, в котором создается экземпляр наблюдаемого.

Таким образом, единственной возможной проблемой здесь может быть то, что ваш MyBase.BaseCollection являетсяноль в начале.Итак, если вы избежите такой ситуации и создадите пустую коллекцию, в которой вы объявили этот наблюдаемый элемент, а затем запустите процесс загрузки таким, какой он есть, то все должно работать нормально.

Надеюсь, это поможет.

...