我已经使用两个列表框(lstSource,lstDest)实现了Drap n Drop功能,用户可以在其中进行drap&删除两个列表之间的项目。 我有两个ObservalableCollections(sourceCollection和ampCollection)绑定到相关列表。 在初始加载方法中,DomainContext从db获取所有任务并将其设置为源Collection。然后我使用LINQ(其中t => t.UserID == thisUserID)从源集合中获取任务子集并设置为destCollection。 现在,用户可以从lstDest(destCollection)添加/删除任务。
我的问题是当用户按下“保存”按钮时,如何将这些更改保存回数据库。
我检查过返回false的DomainContext.HasChanges,因此无法使用context.SubmitChanges()
知道如何使用最新的用户列表在数据库中保存这些更改吗?
我们将不胜感激。
答案 0 :(得分:0)
在集合之间移动项目时,还需要设置一些属性以表示更改。 ObservableCollection公开了可用于此目的的NotifyCollectionChanged事件。所以答案是当Task进入表示当前用户任务的ListBox时,将Task的User属性设置为当前用户,并在进入任务集合时将其删除。
编辑: 我使用的另一种技术,如果集合通常包含适量的项目(我不知道的限制,你必须使用适当的测试数据进行测试),就是将所有项目放在同一个集合中(通常是ObservableCollection)能够动态添加/删除项目而不必担心更新用户界面),并创建两个视图(ICollectionView接口,通常使用Silverlight中的CollectionViewSource创建),每个视图都有一个过滤谓词。视图使用谓词来确定项是否属于视图;所以一个视图可以有谓词条件'用户必须等于当前用户'而另一个'用户必须为空'。
只需在集合中设置实体的用户属性(如果实体实现INotifyPropertyChanged),就会在适当的视图中自动移动实体。当然,这将需要更改问题的拖放部分:将项目放入列表时,需要将其用户属性设置为当前用户或取决于放置目标的null,然后执行其他所有操作关注意见。
更改仍然需要保存到数据库中 - 只需调用SubmitChanges(至少就是在RIA服务中调用的内容,我认为......目前使用太多技术)当用户点击“确定”时或“保存”按钮或其他。修改后的实体将被保存,并且它们将被检测为已修改,因为它们的用户属性已被修改。
答案 1 :(得分:0)
感谢Alex的详细回复。 实际上我需要按照用户想要的顺序(按向上/向下移动项目)对列表进行排序,因此我使用了单独的ObservableCollections。每当用户添加/删除时,更改列表中项目的位置,通过它们循环,重置其索引(优先级),创建新的临时列表并分配给我的目标ObersvableCollection。
但我会尝试你的建议让你知道它是怎么回事。我的数据太大了。
再次感谢您的详细回复。