2010-09-21 28 views
2

我有問題找到一個通用的解決方案來處理WPF和WCF上的枚舉字段,我需要一點幫助。讓我們用一個例子解釋:未定義的枚舉和WPF組合框和WCF序列化

當創建一個性別枚舉值男,女]一個人,我看到三個posibilites:

  1. 男是默認 - >有兩種posibilities但一個是默認。沒有問題結合ComboBox.SelectedValue與WCF序列化沒有問題,只要沒有女性感到ofended :)

  2. ((性別)(3))不定值是默認 - >有兩種posibilities但在開始用戶被迫選擇一個。 ComboBox.SelectedValue正確設置SelectedIndex = -1,但WCF拋出: 枚舉值'3'對'Sex'類型無效,無法序列化。如果類型具有DataContractAttribute屬性,請確保存在必要的枚舉值並使用EnumMemberAttribute屬性標記。

  3. 性屬性可爲空 - >它可以設置性別和你甚至可以取消它一旦你選擇一個。

不幸的是,情況2是最常見的一種,但我們沒有看到一個簡單的方法來處理它不做像黑客:

  • 定義「未知」的價值性,這個值對實體無效,我會考慮它是否不是最常見的情況。
  • 將枚舉標記爲[Flags],因此WCF可以將「Male,Female」編碼爲未知。
  • 用類似[ComboHintUnkwnownOnNew]的裝飾來裝飾性別。
  • Set SelectedIndex = -1,同時保持綁定一些WPF中的方式。

我知道是一個思想設計的決定,而不是一個具體的問題,但我希望得到一些幫助。

+0

你能解釋一下你是如何在這裏使用WCF並提供一些XAML以及回答?我沒有遇到過通過WCF發送並顯示在WPF中的枚舉屬性的任何問題。如果枚舉未定義,那麼顯然必須強制用戶在序列化之前選擇一個值,但是要寫出這必須在開始時發生。你能用一些代碼/ XAML來解釋嗎? – Holstebroe 2010-09-21 11:23:21

+0

由於構建通用解決方案的目的,我們希望將不完整的實體發送到服務器,例如要知道實體是否已授權或可用的操作。 很難挑選一段簡單的代碼,但是需要的是能夠在實體屬性本身編碼樹描述的解決方案,並且知道用戶是否選擇了一架飛機。 – Olmo 2010-09-22 11:27:23

回答

1

如何定義一個客戶端的枚舉(-1爲未定義)的視圖,然後根據性別選擇創建適當的WCF代理枚舉,然後將其發送到服務。所以不要直接綁定到WCF代理類。創建僅客戶端模型並將其轉換爲有效實體(WCF代理類)非常有效。你可以使用像automapper這樣的東西輕鬆做到這一點。

+0

到目前爲止,我們已經成功地保持了相同的模型的觀點,轉移到服務器和服務器本身(www.signumframework.com),我們將保持這一點。通過這種方式,我們只需要一次驗證規則。 – Olmo 2010-09-22 11:30:23

0

到目前爲止,我們已經找到了以下解決方案:

Sex Sex {get; set;} //Default Male 

Sex? Sex {get; set;} //Optional field, none is available in the combobox 

[NotNullValidator] 
Sex? Sex {get; set;} //Default is null, so SelectedIndex=-1 and can be sent via WCF, but the combo does not have the 'none' option and once one Sex is selected u can not turn back. 

對不起,讓這樣一個抽象的和硬的問題