我在掌握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,Dummy对象也实现了INotifyPropertyChanged。
现在添加或更新或删除后的这个实现,ObservableCollection不刷新,我知道我可以放IEnumerable,但我不会看到如何使存储库与ObservableCollection同步的优雅解决方案在模型中,除了查询到CollectionChanged之外,你在那里处理所有的状态,但似乎我会重复自己和我在存储库中做的逻辑。更糟糕的是,让我说我希望从我的存储库向ObservableCollection获取一些推送通知。
我希望我能理解我的问题。
提前致谢。
答案 0 :(得分:1)
您应该在ViewModel上实现INotifyPropertyChanged
,并且您的ObsListDummy属性应该通知ViewModel应用于该集合的更改。所以看起来应该是这样的:
public class ViewModel: INotifyPropertyChanged
{
// Declare the event
public event PropertyChangedEventHandler PropertyChanged;
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
private ObservableCollection<Dummy> _dummyCollection;
public ObservableCollection<Dummy> DummyCollection
{
get { return _dummyCollection; }
set
{
// Set the value and then inform the ViewModel about change with OnPropertyChanged
_dummyCollection = value;
OnPropertyChanged("DummyCollection");
}
}
}
这整个INotifyPropertyChanged
接口和实现包括一些脏工作,比如声明事件和创建一个帮助方法来引发事件,所以我建议你使用像MVVM Light这样的库。
答案 1 :(得分:0)
您应该使用ObservableCollection
类型的成员来存储您的Dummy
ViewModel。在Initialize
方法中,您从存储库中读取虚拟对象,创建Dummy ViewModels
并将其放入ObservableCollection
。现在,当您使用Binding
到ObsListDummy
(并从该集合中添加/删除)时,您的视图将会更新,同时请注意Binding仅适用于公共属性。
现在,每次阅读都只有一个新的ObservableCollection
,不涉及任何事件,因此您的视图永远不会知道更改。
此外,您的ViewModel将实现INotifyPropertyChanged。