Внимание MVVM Имеет смысл: должен ли ViewModel получать доступ к локализованным ресурсам? - PullRequest
11 голосов
/ 18 ноября 2011

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

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

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

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

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

Спасибо, Mark

Ответы [ 5 ]

9 голосов
/ 19 ноября 2011

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

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

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

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

9 голосов
/ 18 ноября 2011

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

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

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

3 голосов
/ 18 ноября 2011

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

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

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

1 голос
/ 18 ноября 2011

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

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

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

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

1 голос
/ 18 ноября 2011

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

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

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