0

我在这里有严重的精神障碍,需要一些帮助。我使用 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 集合中,只是一些事件会触发!

任何想法最受欢迎。

杰森。

4

2 回答 2

2

你在实施 INotifyPropertyChangedItems吗?

作为 ObservableCollection,它会在集合中的单个项目发生更改时处理对它们的调用 INPC,但您仍然需要为属性本身处理此问题。

于 2011-07-05T09:26:39.553 回答
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");
        }
    }

Items 实现了 INotifyPropertyChanged,但在分配 Items 对象时从未调用过它。

现在一切都按预期工作,无需遍历加载的集合并将其添加到 Items ObservableCollection。

于 2011-07-05T20:44:20.497 回答