我无法掌握 MVVM 中的 ObservableCollection 的概念。首先,我想指出我是在 Windows 8/Metro 应用程序中执行此操作,而不是 WPF 或 Silverlight。
根据 microsoft 文档,此集合具有以下用途:“表示一个动态数据集合,可在添加、删除项目或刷新整个列表时提供通知。” 据我了解,这在涉及绑定时对您有很大帮助。在网上我找到了很多简单的示例,通过在运行时创建 ObservableCollection 然后对其进行处理,但我没有找到将这个集合与存储库一起使用的正确方法。
假设我有以下存储库接口,它是 ORM 数据库后端的实现,或原始 ADO.NET 实现
public interface IRepository<T>
{
ObservableCollection<T> GetAll();
void Create();
void Update();
void Delete();
T GetByKey(object key);
}
和一个使用存储库作为模型的简单 ViewModel
public class ViewModel
{
private ObservableCollection<Dummy> _obsListDummy;
private RelayCommand _addCommand,_deleteCommand,_updateCommand;
private IRepository<Dummy> _repositoryDummy;
public class ViewModel()
{
_repositoryDummy=Factory.GetRepository<Dummy>();
}
public ObservableCollection<Dummy> ObsListDummy
{
get
{
return _repositoryDummy.GetAll();
}
}
public RelayCommand AddCommand
{
get
{
if (_addCommand == null)
{
_addCommand = new RelayCommand(p => DoAdd();
//DoAdd method shows a popup for input dummy and then closes;
);
}
return _myCommand;
}
}
........
}
我的观点是一个带有网格的简单 XAML,虚拟对象也实现了 INotifyPropertyChanged。
现在,在添加或更新或删除此实现之后,ObservableCollection 不会刷新,我知道我可以使用 IEnumerable 代替,但我没有看到如何使存储库与 ObservableCollection 中的同步的优雅解决方案模型,除了订阅 CollectionChanged 并在那里处理所有状态,但似乎我会重复自己以及我在存储库中执行的逻辑。更糟糕的是,假设我想从我的存储库中获得一些推送通知,发送给 ObservableCollection。
我希望我了解我的问题。
提前致谢。