【问题标题】:Retrieving data from isolated storage into viewmodel将数据从隔离存储中检索到视图模型中
【发布时间】:2011-07-05 08:41:00
【问题描述】:

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

欢迎任何想法。

杰森。

【问题讨论】:

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


    【解决方案1】:

    您是否在 Items 上实施 INotifyPropertyChanged?

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

    【讨论】:

    • 我已经在 Items 类上实现了 INotifyPropertyChanged,但问题似乎是当反序列化集合分配给 Items 集合时 ObservableCollection 不会触发 CollectionChanged 事件。
    • @Jason 你能提供一个重现项目来确认这一点吗?
    • 我应该直接通过电子邮件发送给您吗?真的不想把它贴在这里!我可以使用您网站上的电子邮件地址吗?
    • 请告诉我把它寄到哪里。谢谢,杰森。
    • 创建一个项目,以最简单的方式重现您的问题,并在此处发布链接。我不能保证对你通过电子邮件发送给我的东西做任何事情。将其发布在此处意味着其他人可能能够在找到解决方案时提供答案或从中受益。
    【解决方案2】:

    到最后才发现。这与 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。

    【讨论】:

    • 这是我的第一个问题,也是我的回答。你说你已经这样做了。
    • @Matt 我对您的回答的解释并没有使我得出最终结论,尽管回想起来您的问题包含指向最终解决方案的指针。 Item 实例化的类中的属性确实实现了 NPC,但是,现在对我来说很明显,仅让类的属性实现 NPC 以及实现类(对象)还需要引发 NPC 事件以更新 UI。再次感谢您在这方面的支持。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多