将数据从隔离存储中检索到viewmodel中

时间:2011-07-05 08:41:01

标签: windows-phone-7 mvvm observablecollection isolatedstorage databound

我在这里遇到严重的精神障碍,并且需要一些帮助。我使用Windows Phone数据绑定应用程序作为我项目的起点,并且对模型,视图模型和视图的交互方式非常满意。

我的问题是示例中使用的数据是在运行时创建的,并添加到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,但UI不会更新。如果我用以下代码替换上面的代码:

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

并迭代检索到的集合,并将新的ItemViewModel集合添加到Items集合中,然后UI上的所有内容都会正确更新。

我的xaml具有正确的绑定,并且DataContext也已正确设置。

我尝试过努力解决这个问题的方法,但是我无法相信唯一的方法是遍历整个加载的集合,将它添加到Items集合中,只有一些事件会触发!

欢迎任何想法。

杰森。

2 个答案:

答案 0 :(得分:2)

您是否在Items上实施了INotifyPropertyChanged?

作为一个ObservableCollection,当它们被更改时,它将处理集合中各个项目的INPC,但你仍然需要为属性本身处理它。

答案 1 :(得分:0)

最后到底了。这与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。