2011-05-10 18 views
0

,我有以下數據模型:Silverlight的併發數據源的Grid的控制

營 - > CampEvent < - 事件。

Camp的CampId和Name與它關聯。 事件具有EventId,名稱,開始/結束(日期)。 CampEvent有(CampId,EventId)PK,CampId FK,EventId FK。

這些表用於創建從Silverlight客戶端使用的域模型和域服務。

我成功地能夠使用網格在Silverlight中顯示事件的表格。

網格有兩個模板列 - 一個顯示覆選框,另一個顯示事件的名稱。

所以現在的問題是,我需要檢查複選框,當這個控制進入編輯模式。

我注意到網格沒有OnDataBound事件,或者它沒有設置每個複選框的狀態來檢查而不是通過綁定的方式。

回答

0

好吧,顯然在Silverlight中,你沒有用GridViewRow的內容搞亂的好處。但是,您可以通過更改基礎數據源來實現此目的。

在上面的場景中,我們有一個用於創建Camp實例並將其與一個或多個事件關聯的控件。在某種意義上,控制可以創建或更新「Camp」對象及其與事件的關係。控制狀態由枚舉public enum Mode { Create, Update };,並根據控制哪個值這個屬性已,控制裝置將做任何一個,或兩個以下結合結合操作:

  1. 獲取所有事件數據和在網格顯示它由具有複選框&標籤的行組成。
  2. 選中表示特定陣營參與的事件的方框。

這在理論上都很不錯,但原則上我意識到Silverlight需要一個獨立的數據源來綁定。我創建了一個CampEvent自定義對象的集合,其中每個元素都有一個布爾屬性IsChecked,以及事件名稱和事件ID。 CampEvent對象不是域實體對象,僅用於綁定。

所以要達到我的目標,這些是我採取的步驟。

  1. 聲明ObservableCollection其中T僅用於綁定。在這種情況下,T的底層數據源是我們的事件,並且使用Linq to Entity查詢來獲取事件的ID和名稱,並將其轉換爲CampEvent對象,其默認IsChecked屬性設置爲false。

  2. 如果控制處於創建模式,我就完成了。 Grid的模板列中的複選框雙向綁定到基礎數據源的IsChecked屬性。第一步就足以創建默認的用戶界面,取消選中所有複選框。否則去3

  3. 那麼,號碼2是錯的,所以控制是在「更新」模式。如果控件的SelectedCamp屬性被設置(並且該屬性的類型爲Camp)。在這一點上,我們創建一個Linq to Entitities查詢,我們要求域服務包含與指定陣營關聯的事件。

  4. 一旦來自查詢的響應到達,我們遍歷每個與陣營關聯的Event對象。對於收到的每個事件,我們檢查它是否存在於我們的ObservableCollection數據源中。如果是這樣,我們爲該項目設置IsChecked屬性爲true。一旦我們的數據綁定了網格,與特定陣營關聯的所有事件都將被「檢查」。

  5. 任務完成。

關於數據庫結構,實體框架生成的域模型和WCF RIA的幾句話。

那麼,事實證明,EF可能會讓你開箱即可享受80%的折扣。該工具不夠智能,無法知道多對多關係是什麼。在與陣營和事件的情況下,我們有以下結構:

camp -> participates in many -> events 
(many) events -> have many -> camps (as participants) 

因此,要做到這一點,我們需要營地和事件之間的「木匠」表。爲了正確地做到這一點,木匠表在理論上應該有起碼兩列:

CampId - >外鍵 EVENTID - >外鍵

現在以創建表的主鍵,我們應該有:

CampId + EventId - >複合主鍵。

使我們的表只有2個字段。現在這是非常重要的,因爲這種關係在EF中創建了可能的導航屬性。

當生成域模型時,EF不會在模型中創建連接器表。但是要啓用Camp和Event之間的導航屬性,反之亦然,必須在底層Dom​​ain Service元數據對象上發生一些事情。

** 1。找到陣營元數據信息。裝飾IEnumerble<Event>Events屬性搭配:

[Include] 
[Association("CampEvent", "CampId", "EventId", IsForeignKey=True)] 

,並解釋這些東西的意思:在include說,每當您查詢的域模型,請包括每個事件指定的營地(S)。該協會表示,營地與活動之間有一個關聯表,供導航財產使用。在查找表中,Camp具有CampId標識符,而Event具有EventId。使用這些查找指定陣營**的所有事件。

2.對任何其他導航屬性都做同樣的事情。