Извлечение данных из изолированного хранилища в viewmodel - PullRequest
0 голосов
/ 05 июля 2011

У меня здесь серьезная психическая блокада, и я нуждаюсь в некоторой помощи. Я использую приложение Windows Phone Databound в качестве отправной точки моего проекта и довольно доволен тем, как взаимодействуют модель, модель представления и представление.

Моя проблема заключается в том, что данные, используемые в примере, создаются во время выполнения и добавляются в объект ObservableCollection. Насколько я понимаю, создание новых объектов ItemViewModel и последующее добавление их в ObservableCollection запускает эквивалент событий NotifyPropertyChanged, которые обеспечивают обновление всех привязок в представлении. Если мое объяснение неверно, я бы приветствовал любые мысли.

Теперь генерация данных во время выполнения бесполезна в большинстве реальных примеров, и поэтому мне нужно сериализовать данные в изолированное хранилище. Это я сделал и могу успешно сохранить и загрузить свой объект ObservableCollection.

Моя проблема возникает, когда я загружаю данные из IsolatedStorage, а затем назначаю возвращенную коллекцию ObservableCollection объекту Items в модели представления.

    public void LoadData()
    {
        App.Measurements = Serialization.Read<measurements>(App.MEASUREMENTS);
        this.IsDataLoaded = true;
    }

App.MEASUREMENTS в простой глобальной переменной, которая содержит имя файла для использования в IsolatedStorage.

Приведенный выше код извлекает данные и присваивает их коллекции Items ObservableCollection, но пользовательский интерфейс не обновляется. Если я заменю код выше на:

    public void LoadData()
    {
        foreach (measurement m in App.Measurements.WeightMeasurements)
        {
            this.Items.Add(m);
        }
        this.IsDataLoaded = true;
    }

, итерация по извлеченной коллекции и добавление новой коллекции ItemViewModel в коллекцию Items, после чего все обновляется в пользовательском интерфейсе правильно.

Мой xaml имеет правильные привязки, и DataContext также настроен правильно.

Я пробовал разные способы, чтобы решить эту проблему, но я не могу поверить, что единственный способ - это перебрать всю загруженную коллекцию, добавив ее в коллекции Items, только некоторые события будут запущены!

Любые мысли приветствуются.

Джейсон.

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Реализуете ли вы INotifyPropertyChanged на Items?

Как ObservableCollection, он будет обрабатывать вызов INPC для отдельных элементов в коллекции, когда они изменены, но вам все равно нужно обрабатывать это для самого свойства.

0 голосов
/ 06 июля 2011

Добрался до дна в конце.Это было связано с определением ObservableCollection.Из коробки это выглядит так

    public ObservableCollection<ItemViewModel> Items { get; private set; }

Однако NotifyPropertyChanged срабатывает только тогда, когда свойство определено так:

    private ObservableCollection<ItemViewModel> _items;
    public ObservableCollection<ItemViewModel> Items
    {
        get
        {
            return _items;
        }
        private set
        {
            if(_items != value)
                _items = value;
            NotifyPropertyChanged("Items");
        }
    }

Элементы реализованы в INotifyPropertyChanged, но никогда не вызывалиськогда объект Items был присвоен.

Теперь все работает так, как ожидалось, и нет необходимости перебирать загруженную коллекцию и добавлять ее в коллекцию Items ObservableCollection.

...