Неопределенный Enum и WPF ComboBox и WCF Сериализация - PullRequest
2 голосов
/ 21 сентября 2010

У меня проблемы с поиском общего решения для работы с полями Enum в WPF и WCF, мне нужна небольшая помощь. Поясним на примере:

При создании лица со значением enum [мужчина, женщина] я вижу три возможности:

  1. Мужской по умолчанию -> Есть две возможности, но одна по умолчанию. Нет проблем с привязкой ComboBox.SelectedValue и нет проблем с сериализацией WCF, если только женщина не чувствует себя завершенной:)

  2. ((Пол) (3)) По умолчанию не определено значение -> Есть две возможности, но в начале пользователь вынужден выбрать одну. ComboBox.SelectedValue правильно устанавливает SelectedIndex = -1, но WCF выбрасывает: Значение перечисления «3» недопустимо для типа «Пол» и не может быть сериализовано. Убедитесь, что необходимые значения перечисления присутствуют и помечены атрибутом EnumMemberAttribute, если тип имеет атрибут DataContractAttribute.

  3. Свойство Sex имеет значение nullable -> Это необязательно для установки пола, и вы можете даже сбросить его, как только выберете один.

К сожалению, случай 2 является наиболее распространенным, но мы не видим простого способа справиться с ним без таких хаков, как:

  • Определите значение «Неизвестно» для Пола, это значение недопустимо для сущности, я бы подумал, не будет ли это наиболее распространенным сценарием.
  • Пометить перечисление как [Flags], чтобы WCF мог кодифицировать «Мужчина, Женщина» как неизвестное.
  • Украсьте свойство sex чем-то вроде [ComboHintUnkwnownOnNew].
  • Установите SelectedIndex = -1, сохраняя привязку как в WPF.

Я знаю, что это решение о дизайне мысли, а не конкретная проблема, но я был бы признателен за помощь.

Ответы [ 2 ]

1 голос
/ 21 сентября 2010

Как насчет определения перечисления на стороне клиента (с -1 для неопределенного) только для представления, а затем в зависимости от выбранного пола создайте соответствующее перечисление прокси WCF и отправьте его в службу. Так что не связывайте данные напрямую с прокси-классами WCF. Вполне допустимо создавать только клиентские модели и преобразовывать их в действительные сущности (прокси-классы WCF). Вы можете использовать что-то вроде autopper, чтобы сделать это легко.

0 голосов
/ 22 сентября 2010

На данный момент мы нашли следующее решение:

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.  

Извините, что сделали такой абстрактный и трудный ответ на вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...