Как работать с ViewModel и базой данных в приложении C # / WPF / MVVM - PullRequest
1 голос
/ 23 марта 2010

У меня есть программа управления задачами с полем «Срочность». Допустимые значения: Int16 в настоящее время сопоставлены с 1 (Высокий), 2 (Средний), 3 (Низкий), 4 (Нет) и 99 (Закрыт). Поле срочности используется для ранжирования задач, а также для изменения вида элементов в списке и подробном представлении.

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

Поскольку один и тот же экран может использоваться для просмотра закрытой задачи, срочность «Закрыто» должна быть в ItemsSource, но я не хочу, чтобы пользователь мог ее выбрать. Для того, чтобы пользователь не мог выбрать этот элемент в ComboBox, но все равно мог видеть его, если элемент в базе данных имеет это значение, я должен ...

  1. Вручную отключите элемент в ComboBox в коде или Xaml (я сомневаюсь в этом)
  2. Измените коллекцию Urgency с Int16 на Объект с Свойством Selectable, к которому привязывается свойство isEnabled объекта ComboBoxItem.
  3. Сделайте, как в 2, но также разделите информацию о срочности в свою собственную таблицу в базе данных с внешним ключом в таблице Задачи
  4. Ничего из вышеперечисленного (я подозреваю, что это правильный ответ)

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

Спасибо

Mike

Ответы [ 2 ]

1 голос
/ 23 марта 2010

Я думаю, что сначала исправлю это в представлении. Имейте TextBlock, который отображает «Закрыто», и ComboBox, который отображает другие значения, а затем используйте триггер данных, чтобы установить IsVisible для обоих в зависимости от того, является ли Срочность 99.

Я бы сделал это не потому, что это лучшее техническое решение (вероятно, нет), а потому, что это (возможно) лучшее решение для пользовательского интерфейса. Если пользователь не может изменить закрытый элемент, будет немного обманчиво отображать «Закрыто» даже в отключенном ComboBox, поскольку ComboBox визуально означает «Вот что вы можете изменить». То, что он отключен, просто заставляет пользователя задуматься, что он должен сделать, чтобы включить его. Использование TextBlock - это недвусмысленный способ сказать, что «это просто так».

1 голос
/ 23 марта 2010

Я бы предпочел вариант 2. Звучит очень стильно для MVVM.

Вариант 3 был бы предпочтительным, когда есть другие приложения или когда у вас есть отчеты, обращающиеся к полю «Срочность».Причина: в противном случае вам нужно будет дублировать знания о сопоставлении между Int16 и их значением.Переместите знания в базу данных, чтобы сохранить их в одном месте.

Может быть, рассмотрим Enums, чтобы сделать код более выразительным:

enum Urgency { High=1, Medium=2, Low=3, Closed=99 };

Таким образом, у вас будет что-то приятное для оценки IsEnabledсвойство, подобное этому:

if (urgency == Urgency.Closed) return false;

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

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