Silverlight 4.0 Silverlight4 ObservableCollection和数据库更新

Silverlight 4.0 Silverlight4 ObservableCollection和数据库更新,silverlight-4.0,observablecollection,Silverlight 4.0,Observablecollection,我使用两个列表框(lstSource,lstDest)实现了拖放功能,用户可以在两个列表之间拖放项。 我有两个observableCollection(sourceCollection和destCollection),它们绑定到相关列表。 在初始加载方法中,DomainContext从db获取所有任务,并将其设置为源集合。然后,我使用LINQ(其中t=>t.UserID==thisUserID)从源集合中获取任务子集并设置为destCollection。 现在,用户可以从lstDest(dest

我使用两个列表框(lstSource,lstDest)实现了拖放功能,用户可以在两个列表之间拖放项。 我有两个observableCollection(sourceCollection和destCollection),它们绑定到相关列表。 在初始加载方法中,DomainContext从db获取所有任务,并将其设置为源集合。然后,我使用LINQ(其中t=>t.UserID==thisUserID)从源集合中获取任务子集并设置为destCollection。 现在,用户可以从lstDest(destCollection)添加/删除任务

我的问题是,当用户按下保存按钮时,如何将这些更改保存回数据库

我已经检查了DomainContext.HasChanges,它返回false,因此无法使用context.SubmitChanges()

您知道如何将这些更改保存在数据库中,并为用户提供最新的任务列表吗


任何回复都将不胜感激。

当您在集合之间移动项目时,您还需要设置其某些属性以表示更改。ObservableCollection公开可用于此目的的NotifyCollectionChanged事件。因此,答案是当任务进入表示当前用户任务的列表框时,将任务的用户属性设置为当前用户,并在进入任务集合时将其删除

编辑: 我使用的另一种技术是,如果集合通常包含适量的项(限制是什么,我不知道,您必须使用适当的测试数据进行测试),则将所有项放在同一个集合中(通常是ObservableCollection,以便能够动态添加/删除项,而不必担心更新用户界面),并创建两个视图(ICollectionView接口,我认为通常使用Silverlight中的CollectionViewSource创建),每个视图都有一个过滤谓词。视图使用谓词确定项目是否属于视图;因此,一个视图可以具有谓词条件“用户必须等于当前用户”,另一个视图可以具有谓词条件“用户必须为空”

只需设置集合中某个实体的用户属性(如果该实体实现INotifyPropertyChanged),即可在相应视图中自动移动该实体。当然,这需要对问题的拖放部分进行更改:当将项目拖放到列表中时,需要根据拖放目标将其用户属性设置为当前用户或null,然后视图会处理所有其他内容


当用户单击“确定”或“保存”按钮或其他按钮时,这些更改仍然需要保存到数据库中,只需调用SubmitChanges(至少在RIA服务中是这样称呼的,我认为……目前正在使用太多的技术)。修改后的实体将被保存,并且它们将被检测为已修改,因为它们的用户属性已被修改。

感谢您的详细回复。 实际上,我还需要按照用户想要的顺序对列表进行排序(通过向上/向下移动项目),因此我使用了单独的ObservableCollections。每当用户添加/删除时,更改列表中项目的位置,我循环遍历它们,重置它们的索引(优先级),创建一个新的临时列表并分配给我的dest ObersvableCollection

但我会试试你的建议,让你知道进展如何。我的数据不太大


再次感谢您的详细回复。

这是否意味着它也将更新/通知后端数据库?否;INotifyCollectionChanges仅定义更改集合时引发的事件,参数包含有关更改的详细信息。这取决于谁在听那个事件。默认情况下,当集合绑定到ItemsControl时,WPF侦听该事件,以便在用户界面中正确反映动态添加和删除项,而无需其他任何操作。您可以侦听同一事件。您还可以在同一集合中保留实体,并在该集合的顶部创建两个过滤视图。事实上,你知道吗,我会用这个建议更新我的答案。