2010-09-18 346 views
0

我已經實現了使用兩個列表框(lstSource,lstDest)的Drap n Drop功能,其中用戶可以在兩個列表之間拖放&拖放項目。 我有兩個ObservalableCollections(sourceCollection & destCollection)綁定到相關列表。 在初始加載方法中,DomainContext從db獲取所有任務並將其設置爲源Collection。然後,我使用LINQ(其中t => t.UserID == thisUserID)從源集合中獲取任務的子集並設置爲destCollection。 現在用戶可以從lstDest(destCollection)添加/刪除任務。Silverlight4 ObservableCollection和數據庫更新

我的問題是如何在用戶按下保存按鈕時將這些更改保存回數據庫。

我已經檢查返回false,所以不能使用context.SubmitChanges()

不知道如何保存在與用戶的任務列表最新分貝的變化DomainContext.HasChanges?

任何迴應將不勝感激。

回答

0

當您在集合之間移動項目時,還需要設置其某些屬性來表示更改。 ObservableCollection公開可以用於此目的的NotifyCollectionChanged事件。因此,答案是當任務進入表示當前用戶任務的列表框時,將任務的用戶屬性設置爲當前用戶,並在進入任務集合時將其刪除。

編輯: 我使用的另一種技術,如果集合通常包含適量的項目(我不知道的限制是什麼,您必須使用適當的測試數據進行測試),是讓所有項目都在相同的集合(通常是ObservableCollection能夠動態添加/刪除項目,而不必擔心更新用戶界面),並創建兩個視圖(ICollectionView接口,通常在Silverlight中我創建的CollectionViewSource創建),每個視圖都有一個過濾謂詞。該視圖使用謂詞來確定項目是否屬於該視圖;所以一個視圖可以具有謂詞條件'用戶必須等於當前用戶'而另一個'用戶必須爲空'。

只需在集合中設置實體的用戶屬性(如果實體實現INotifyPropertyChanged)將自動將實體移動到適當的視圖中。當然,這需要修改問題的拖放部分:將項目拖放到列表中時,需要根據拖放目標將其用戶屬性設置爲當前用戶或空值,然後執行其他操作關心的意見。

這些修改仍然需要保存到數據庫 - 只需調用SubmitChanges(至少這就是RIA服務中所稱的,我認爲......此時使用的技術太多),當用戶單擊「確定'或'保存'按鈕或其他。被修改的實體將被保存,並且它們將被檢測爲已修改,因爲其用戶屬性已被修改。

+0

這是否意味着它也會更新/通知後端數據庫? – Jhelumi786 2010-09-18 21:19:26

+0

不; INotifyCollectionChanges只是簡單地定義了一個事件,當集合發生變化時引發一個事件,其中的參數包含有關這些變化的細節。這取決於誰在聽該事件。默認情況下,當集合綁定到ItemsControl時,WPF監聽該事件,以便動態地添加和移除項目在用戶界面中正確地反映而沒有其他任何內容。你可以聽同一個事件。 – 2010-09-19 10:19:00

+0

你可以做的其他事情是將實體放在同一個集合中,並在該集合上創建兩個過濾的視圖。其實你知道什麼,我會用這個建議更新我的答案。 – 2010-09-19 10:21:18

0

感謝您的詳細回覆亞歷克斯。 其實我需要保持列表排序以及用戶想要的順序(通過向上/向下移動項目),所以我使用了單獨的ObservableCollections。無論何時用戶添加/刪除,更改列表中項目的位置I循環通過它們,重置其索引(優先級),創建一個新的臨時列表並分配給我的dest ObersvableCollection。

但我會嘗試你的建議,讓你知道它是怎麼回事。我的數據不是太大。

再次感謝您的詳細回覆。