我在这里遇到严重的精神障碍,并且需要一些帮助。我使用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集合中,只有一些事件会触发!
欢迎任何想法。
杰森。
答案 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。