Silverlight 如何在MVVM模式中实现INotifyPropertyChanged和observableCollection?

Silverlight 如何在MVVM模式中实现INotifyPropertyChanged和observableCollection?,silverlight,mvvm,Silverlight,Mvvm,我在模型中有一个产品的ObservableCollection,我希望ViewModel能够监听产品ObservableCollection中的任何更改 我不知道如何去实施它。我读了好几篇教程,但大多数都不是MVVM特有的 如果要在ViewModel类中实现INotifyPropertyChanged,如何指定要侦听产品的OberserableCollection 谢谢:已经实现了NoItIfyPrimeType,所以你不需要。我知道这已经被回答了,但是还有更多的要考虑。 1) ViewMode

我在模型中有一个产品的ObservableCollection,我希望ViewModel能够监听产品ObservableCollection中的任何更改

我不知道如何去实施它。我读了好几篇教程,但大多数都不是MVVM特有的

如果要在ViewModel类中实现INotifyPropertyChanged,如何指定要侦听产品的OberserableCollection


谢谢:

已经实现了NoItIfyPrimeType,所以你不需要。

我知道这已经被回答了,但是还有更多的要考虑。

1) ViewModel应该实现INotifyPropertyChanged,这是使其成为ViewModel的因素之一。即使在不太可能的情况下,它公开的唯一属性是ObservaleCollection,它也需要在实际ObservaleCollection属性发生更改时引发属性更改(在第3项中对此进行了详细介绍)

2) 您真的希望ViewModel侦听这些更改还是视图?这是两件不同的事情。ViewModel应该保存一个ObservableCollection,然后将其绑定到视图。您需要的是视图对这些更改做出反应。在这种情况下,Brandon是正确的,ObservableCollection为您提供了现成的解决方案。因此,视图将ViewModel的一个实例设置为DataContext,并且视图中的某些可视元素绑定到ObservableCollection(就像ListBox上的ItemsSource)

3) 例外情况是ViewModel中的ObservableCollection属性本身。虽然ObservableCollection实现INotifyPropertyChanged,但这是集合对象的一部分:当该对象引用在ViewModel中更改(如重新创建)时,ViewModel仍需要报告ObservableCollection的属性已更改


只是一些想法。

好的,那么我是否必须明确地告诉我的ViewModel以侦听模型中的更改?不,您只需要绑定到ObservableCollection。添加、删除项目或刷新collectin时,将通知您的UI。这里有一篇很好的文章解释了这一点。另外,确保不要用另一个实例替换ObservableCollection。如果有理由清空整个集合并用其他内容替换它,则需要清除()集合,然后向其中添加()或AddRange()新项。如果替换实例,视图将丢失其绑定。@nlawalker:绑定本身仍然有效,但它指向的对象不再可用。这样说意味着绑定必须重新编码,而实际上并没有。相反,必须重新计算绑定,这就是您在集合属性上引发PropertyChanged的原因。始终使用Clear和Add可以很好地工作,但严格来说并不必要。@BrandonZeider-我同意这有点不合常规,当然也不是我想要的。我只是想为以后可能找到它的任何人添加信息。非常感谢,它们是非常有用的评论。1.我确实希望ViewModel侦听模型中OberservableCollections中的更改。视图将dataContext设置为my ViewModel,文本框绑定到ViewModel中的observableCollection,因此一旦绑定ViewModel中的observableCollection和视图,视图应自动反映更改。2.谢谢你指出,我也将不得不实现iNotifyProperty:)但在这个阶段我并不担心它,我只想让事情进展顺利,并在过程中进行修改。我不能完全确定这些行动的实施情况,我也没有找到很多详细的教程,你有什么想法吗?再次感谢:)您的回答中令人困惑的部分是:1)ObservableCollection应该属于您的ViewModel,而不是模型本身。我会发现模型类使用ObservaleCollection很奇怪。2) 为什么要将文本框绑定到集合?3) 在ViewModel上实现INotifyPropertyChanged应该是您要做的第一件事,因此您已经“处于该阶段”。大多数人把它放在ViewModelBase类中,所以他们总是有它。我现在没有任何东西,但我正在处理中。我给出了一个名为“实用MVVM”的演示,其中包括一个简单的实现。您可以在“MVVM.pptx”下载PPT,在“”下载解决方案。如果你能看到演示文稿,他们会对你更有意义,但希望它会有帮助。嗨,乔尔。谢谢你的回复。1.如果我在模型中使用请勿使用ObservableCollection for,那么如果模型中有一些更改,我是否能够通知ViewModel?2.抱歉,我的意思是我的文本框绑定到ViewModel类中我的ObservableCollection的属性。3.嗯。。我已经在我的BaseViewModel类中实现了PropertyChanged,我只是不知道如何使用它。。。问题是我在网上找不到任何示例代码:(