基本上这是一个与this one非常相似的问题,差别很大,我不能轻易“只在模型中使用一个可观察的集合”;一个很好的例子是字典的密钥收集。
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
public class Data
{
private Dictionary<String, String> _randomData;
public Data()
{
_randomData = new Dictionary<String, String>();
}
public ICollection<string> RandomDataKeys {
get {
return _randomData.Keys;
}
}
public void AddElement(string k, string v) {
_randomData[k] = v;
}
}
public class DataViewModel
{
private Data _data;
public DataViewModel(Data data)
{
_data = data;
RandomData = new ObservableCollection<String>(_data.RandomDataKeys);
//obviously above wouldn't work, since it just copies the keys.
}
public ObservableCollection<String> RandomData {get; set;}
}
现在常见的方法是什么?备份是更改“add”函数以告诉viewmodel添加了一个新项目(但这需要模型获得有关viewmodel的信息,在viewmodel上显式调用一个函数来告诉viewmodel保留一个副本模型的数据,这感觉浪费和缓慢)。
答案 0 :(得分:0)
问题是,当您执行此操作RandomData = new ObservableCollection<String>(_data.RandomDataKeys);
时,您基本上会创建一个新的集合实例。因此,当您更新_data.RandomDataKeys
时,此更改不会反映在您的可观察集合中。
请阅读this
最好的方法是在Data类中使用ObservableCollection,但如果你不想这样做,你可以改变你的
public ObservableCollection<String> RandomData {get; set;}
要
public ObservableCollection<String> RandomData
{
get { return new ObservableCollection(_data.RandomDataKeys); }
}
但绝对不是一个好主意,每次都要创建新的集合。
因此,您可以尝试在Data类中实现INotifyPropertyChanged接口,并直接绑定到_data.RandomDataKeys