Внимание Пуристы MVVM: Должен ли ViewModel доступ к локализованным ресурсам?

Я изо всех сил пытаюсь понять цель ViewModel, особенно в отношении того, что она должна и не должна делать.

Итак... Я считаю, что хочу показать строку отображения из моего ViewModel. Хорошо, на самом деле это строка Date, где я хочу отобразить что-то вроде "Неизвестно", если дата не установлена. На самом деле я хочу, чтобы решение охватывало общий случай, поэтому я не хочу обсуждать использование нулевых и резервных значений. В равной степени это может быть сообщение о статусе типа "Ожидание отправки" или "Запуск с отменой".

Итак, вопрос заключается в том, как должен ViewModel выставлять отображаемые строки в представление. Приложение должно быть локализовано, поэтому мы не можем иметь жестко закодированные строки в ViewModel.

Можно ли получить доступ к ресурсам приложений из ViewModel и вернуть строку отображения?

Как в стороне, следует ли использовать ресурс строки resx или словарь ресурсов Xaml? Я склоняюсь к Xaml. Преимущества/недостатки?

Спасибо, Марк

Ответ 1

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

Я удивлен, однако, не слышу предложений о datatriggers. Используйте их в своем TextBlock для привязки к отображаемому значению состояния перечисления и соответствующим образом обновите текст. Этот вопрос сравнивает их эффективность с привязкой к конвертеру и предполагает, что триггеры будут работать лучше в этом сценарии. Я сам себя не тестировал, поэтому не уверен, но для меня это кажется интуитивно разумным, если вы не слушаете возмутительное количество разных значений перечисления. Я также думаю, что это более подходящий метод в этом случае, и я приведу этот вопрос с просьбой о сравнении вариантов использования VC и DT, хотя я не думаю, что это очень спорная. Другими словами, , если, считается, что виртуальная машина является преобразователем значений на стероидах (утверждение, которое я очень неактуально и не согласен или не согласен на данный момент), тогда этот аргумент: виртуальная машина не должна показывать свойства отображения; цель и способности VM - это супер-набор из VC; поэтому VC не должен показывать свойства отображения.

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

Что касается вашего ресурсного вопроса, посмотрите эту статью MSDN о файлах ресурсов, которая, в определенном смысле, упрощает работу с чем файл resx. Какой подход вы должны использовать, зависит от ваших вариантов использования.

Ответ 2

Что вы делаете, так это взятие данных внутри системы и преобразование их в формат, который делает его более полезным и понятным для пользователя. На это лежит мнение. На себя будет возложена задача форматировать действительную дату в правильную культуру и она несет ту же ответственность за любой текст, который вы хотите отобразить.

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

Если говорить, что я, как известно, ставил логику отображения в моей модели просмотра (например, конкатенацию имени и фамилии) просто потому, что это проще. Я даже знал, что использую код (удар, ужас!), Где он подходит для моей цели. Между чистотой и прагматизмом существует скользящая шкала, и вам решать, где вы сидите на этой линии.

Ответ 3

Отображение строки Неизвестно, когда дата не установлена, является проблемой отображения и поэтому должна быть разрешена в представлении. Даже "Ожидание отправки" представляет собой представление ценности.

Итак, ответ таков: модель представления никогда не должна выставлять строки display. Модель представления должна выставить значение, которое приведет к отображению/конвертеру/любому объекту из уровня представления, чтобы выбрать строку отображения.

Даже если этот ответ не является ответом, который вы хотите прочитать, это ответ, который должен дать пурист MVVM. И как вы просили пуристов MMVM, вот оно.

Ответ 4

В течение даты у меня будет ViewModel экспортировать значение DateTimeOffset с нулевым значением, где нулевое значение означает "не установлено". В представлении (через конвертер или подобное) нулевое значение отображается как что угодно.

В сторону: я бы использовал resx. Причина в том, что существует определенный резервный механизм, когда строки не доступны на языке.

Ответ 5

Подход, который я предпринял, - это создание ресурсов, связанных с культурой, и добавление экземпляров (одиночных чисел?) из них в ViewModel.

Затем представление может просто привязываться к ViewModel.Resource.DisplayString

См. эту статью для Windows Phone 7, которая легко переводится в WPF.

Если вам не нравится это, потому что вы не хотите привязывать специфический для культуры ресурс к ViewModel и хотите, чтобы View решила его, вы могли бы использовать/написать ValueConverter, который превращает значение из свойства VM в строку отображения.