2010-09-21 32 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. 

对不起,让这样一个抽象的和硬的问题