我有一个Silverlight应用程序,其中DataForm
绑定PagedCollectionView
包含实现IEditableObject
的对象。每当用户使用DataForm编辑对象时,集合上的CollectionChanged
事件将触发两次,首先是删除操作,然后是添加操作。
这不是我想要的。我只想编辑集合中的对象而不触发CollectionChanged事件。
当我尝试在一个简单的测试应用程序中重现此问题时,它的行为与我想要的一样(即不触发事件),我无法弄清楚导致我的主应用程序和测试应用程序之间的行为差异的原因。
有人知道DataForm何时决定更改集合,而不是简单地编辑对象?造成这种差异的原因是什么?
These articles让我想到了滤镜,事实证明,对PagedCollectionView应用了过滤器会带来不同。使用过滤器:用户的编辑操作会导致从集合中删除/添加,不带过滤器:不会更改集合,只需编辑对象。
所以现在问题是:为什么过滤器导致删除/添加行为(即使过滤器只是'返回true',即允许集合中的所有条目)以及如何防止这种情况?
答案 0 :(得分:4)
看起来我终于找到了答案。解决方案是不听取PagedCollectionView
的CollectionChanged事件,而是收听PagedCollectionView.SourceCollection
的CollectionChanged事件。在我的例子中,这是一个ObservableCollection,所以它实际上有一个CollectionChanged事件。
为了让我弄明白这一点,我需要意识到PagedCollectionView
应该被认为是一个包围集合的视图,而不仅仅是另一种类型的我可以使用的集合。以这种方式看待它,很明显你想要在底层集合中寻找变化,而不是在视图中。一旦你弄明白了,这一切都非常明显: - )