代码之家  ›  专栏  ›  技术社区  ›  Olmo

未定义的枚举和WPF组合框以及WCF序列化

  •  2
  • Olmo  · 技术社区  · 16 年前

    当创建一个具有性别枚举值[男性,女性]的人时,我看到三个posiblite:

    1. 男性为默认值 ->有两种可能性,但一种是默认的。绑定ComboBox.SelectedValue没有问题,WCF序列化也没有问题,只要没有女性感觉到被期望:)

    2. ((Sex)(3))未定义的值是默认值 ->有两种可能性,但是 用户被迫选择一个。ComboBox.SelectedValue正确设置SelectedIndex=-1,但WCF抛出: 枚举值“3”对于类型“Sex”无效,无法序列化。如果类型具有DataContractAttribute属性,请确保存在必要的枚举值并使用EnumMemberAttribute属性标记。

    3. 性属性为空 ->设置性别是可选的,一旦你选择了性别,你甚至可以取消设置。

    不幸的是,案例2是最常见的一个,但我们无法找到一种简单的方法来处理它,而不进行如下黑客攻击:

    • 为Sex定义“Unknown”值,这个值对实体无效,我会考虑它是否不是最常见的场景。
    • 将枚举标记为[标志],以便WCF可以将“男性,女性”编码为未知。
    • 设置SelectedIndex=-1,同时在WPF中保留一些how。

    我知道这是一个思想设计的决定,不是一个具体的问题,但我会感谢一些帮助。

    2 回复  |  直到 16 年前
        1
  •  1
  •   softveda    16 年前

    为视图定义一个客户端枚举(未定义时为-1)如何,然后根据所选的性别创建适当的WCF代理枚举,然后将其发送到服务。因此,不要直接将数据绑定到WCF代理类。创建仅客户端模型并转换为有效实体(WCF代理类)是非常有效的。你可以使用像automapper这样的工具来轻松完成这项工作。

        2
  •  0
  •   Olmo    16 年前

    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.  
    

    很抱歉把这个抽象而难以回答的问题