WPF: MVVM говорит нет конвертерам, но мне нужны хорошие значения enum - PullRequest
8 голосов
/ 19 апреля 2011

На уровне модели я определил перечисление:

public enum MemberStatus
{
    ActiveMember = 0,
    InactiveMember = 1, 
    Associate = 2,
    BoardMember = 3,
    Alumni = 4
}

На мой взгляд, у меня есть поле со списком, которое заполняется следующими значениями перечисления:

<UserControl.Resources>

  <ObjectDataProvider 
      x:Key="memberStatusesDataProvider" 
      ObjectType="{x:Type system:Enum}" 
      MethodName="GetValues">
    <ObjectDataProvider.MethodParameters>
      <x:Type TypeName="model:MemberStatus" />
    </ObjectDataProvider.MethodParameters>
  </ObjectDataProvider>

</UserControl.Resources>
...
<ComboBox 
    ItemsSource="{Binding Source={StaticResource memberStatusesDataProvider}}" 
    SelectedItem="{Binding Path=Status}" />
...

Этоприводит к получению поля со списком с вариантами, которые точно совпадают со значениями, определенными в перечислении.Хотя это и было моей первоначальной целью, я хочу более приятную презентацию для пользователя, что-то вроде этого:

  • Выбор поля со списком:
    • Активный член
    • Неактивный член
    • Ассоциированный
    • Член правления
    • Выпускники

Кроме того, если язык в приложении изменяется, мне нужноперечислить значения на этом языке.Чтобы решить эту проблему, первое, что мне пришло в голову, - это создать конвертер для значений MemberStatus enum.Я нашел эту прекрасную статью на эту тему: http://www.codeproject.com/KB/WPF/FriendlyEnums.aspx Но паттерн MVVM говорит о том, что почти не нужно их создавать - и я согласен с этим.Тем не менее, это утверждение не работает в мою пользу в этом примере.

Как это должно быть сделано?Благодарю.

Ответы [ 4 ]

3 голосов
/ 29 октября 2014

Конвертеры полезны не только для конвертации enum с.Конвертеры также более многоразового использования , чем одноразовые viewmodel.

  • Возможно, я захочу преобразовать bool в Brush, и я могу указать все параметры в представлении.

  • Или, может быть, я хочу преобразовать string в DateTime и вернуть все обратно через привязку данных.Может быть, я хочу преобразовать все в заглавные буквы .Тогда есть мой любимый BoolToVisibilityConverter .

Я бы не хотел ставить явный прямой или косвенный код по всемумои VM s только для того, чтобы некоторые меньшинства были счастливы.Я бы сказал, что они забывают, что конвертеры легко доступны из Expression Blend .

. Конвертеры являются неотъемлемой частью WPF и привязкой дополнений между view и viewmodel.

Не вижу причин, по которым вы не можете использовать их в течение enum с.

3 голосов
/ 19 апреля 2011

Мнение, что MVVM делает преобразователи значений устаревшими, похоже, пришло от Джоша Смита, который пишет в своем блоге Философия MVVM :

... класса ViewModelпо сути является конвертером значений для стероидов, что делает интерфейс IValueConverter несущественным для большинства привязок.

Что я извлекаю из этого (и я согласен с ним в том, чего он стоит), так это модель представления.отвечает за все преобразования из представления модели в мир в представления, что делает преобразователь устаревшим.

Наличие enum (который является очень ориентированным на данные типом данных) в модели, доступной для пользовательского интерфейса, определенно являетсязапах - хотя бы по той причине, которую вы видите, для показа пользователю не идеальной информации.

Поместите отображение из enum в строку UI в вашей View Model.

2 голосов
/ 21 апреля 2011

Я не согласен с тем, что MVVM делает ValueConverters устаревшими. Существует более чем достаточно сценариев, в которых реализация ValueConverter более целесообразна, чем реализация преобразования в классе ViewModel.

Возможно, вас заинтересует BookLibrary пример приложения WPF Application Framework (WAF) . Он показывает, как перечисление может быть локализовано в приложении MVVM. Пожалуйста, ознакомьтесь с классом BookLibrary.Presentation / Converters / LanguageToStringConverter.

2 голосов
/ 19 апреля 2011

MVVM на самом деле не имеет четкого представления о том, какие части WPF разрешены и запрещены. Конвертеры хороши в использовании, если они легко достигают вашей цели. Я бы даже предложил сделать еще один шаг и сделать MarkupExtension для предоставления значений перечисления и их строковых эквивалентов. Вы можете хранить строки в DescriptionAttribute для каждого значения перечисления.

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