2009-07-28 5 views
1

Я использую PRISM (и, следовательно, шаблон MVVM). У меня есть сложный режим выбора DateTime с переключателями. Пользователь может выбрать сегодня, вчера, дату, неделю в году и т. Д. Я использую переключатели для разных вариантов.Howto RadioButtons и MVVM pattern

Каков наилучший способ сделать это в MVVM? Я действительно не могу представить себе чистый способ. Я мог бы создать множество пользовательских способов поведения для добавления к каждому элементу, чтобы отслеживать их, но он, похоже, не поддерживается.

Я собираюсь поместить код, но я действительно не люблю это, и для меня он нарушает принцип MVVM (помещайте все в XAML).

У кого-нибудь есть лучшая идея о том, как это сделать?

ответ

0

Как насчет ComboBox вместо из RadioButton с представляющим списком TimeOffset (пользовательского класса) привязанной к вашему ViewModel, с соответствующим SelectedTimeOffest собственности.
Если вам нужно отобразить дополнительную информацию в зависимости от типа TimeOffset, например. a WeekOffset (подкласс TimeOfset) с собственностью WeekCount, имеют контроль содержания с несколькими DataTemplate s подгоняемые по типу TimeOFfset.

Просто идея ...

0

ViewModel разработан, чтобы представить модель таким образом, представление может потребить.

В этом случае вы можете иметь логическое свойство для каждой кнопки в виртуальной машине, а когда кнопка обновляет ее, она просто устанавливает для всех других свойств значение false. Затем в вашем представлении вы можете привязать все свойства IsChecked к соответствующему свойству в ViewModel.

Кроме того, имейте в виду, что в WPF есть привязки переключателей bug. Here's - потенциальное решение.

+0

Ничего себе, я писал, что возраст черепашек назад и я не понимал, что у него так много внимания;) Обратите внимание, что его исправлено в .NET 4. –

+0

@JC Итак, вы ответственны! :П –

2

Сохраните RadioButtons, добавьте на свою виртуальную машину тип перечисления, который может возвращать такие вещи, как «Сегодня», «Вчера» или «Завтра». На стороне пользовательского интерфейса создайте ValueConverter, который принимает параметр «Завтра» и сравнивает его со значением привязки на VM, а затем возвращает bool? необходимо для IsChecked.

1

Поместите его в код позади.

Модель M-V-VM не «помещает все в xaml», это «отдельные проблемы». Ваша виртуальная машина хочет иметь право на DateTime? В этом случае все равно, как выбирается DateTime, ему просто нужен DateTime.

Ввод логики просмотра в ViewModel не является хорошей идеей, так как теперь вы даете знание VM о работе представления. Поток предназначен для просмотра, который знает о ViewModel, который знает о модели. Обратное, как правило, неверно. (Как и при всех вещах, связанных с компьютером, всегда есть исключения)

Надеюсь, это поможет.