如何使用单选按钮和MVVM模式

时间:2009-07-28 07:50:05

标签: wpf silverlight xaml silverlight-3.0 mvvm

我正在使用PRISM(因此也就是MVVM模式)。我有一个带有单选按钮的复杂DateTime选择器视图。 用户可以选择今天,昨天,一个日期,一年中的一周等。我使用单选按钮进行不同的选择。

MVVM中最好的方法是什么? 我真的想不出干净的方式。我可以创建许多自定义行为来添加到每个项目以跟踪它们,但它似乎不可维护。

我将放置一些代码隐藏但我真的不喜欢这样,对我来说它打破了MVVM原则(将所有内容都放在XAML中)。

有没有人对如何解决这个问题有更好的了解?

5 个答案:

答案 0 :(得分:2)

保留RadioButtons,为您的VM添加一个枚举类型,可以返回“今天”“昨天”或“明天”等内容。在UI端创建一个ValueConverter,它接受像“Tomorrow”这样的参数并将其与VM上的绑定值进行比较,然后返回bool? IsChecked需要。

答案 1 :(得分:1)

把它放在代码背后。

M-V-VM模式并非“将所有内容都置于xaml中”,而是“单独关注”。你的VM想要一个DateTime吗?在这种情况下,它不关心如何选择DateTime它只需要一个DateTime。

将View逻辑放在ViewModel中并不是一个好主意,因为您现在正在向VM提供有关View工作方式的知识。该流程意味着View了解了解Model的ViewModel。反过来通常不正确。 (与计算机相关的所有事情一样,总有例外)

希望这有帮助。

答案 2 :(得分:0)

ComboBox而不是RadioButton提供绑定到您的ViewModel的TimeOffset(自定义类)列表,具有相应的SelectedTimeOffest属性。
如果您需要根据TimeOffset的类型显示额外信息,例如具有WeekOffset属性的TimeOfsetWeekCount的子类)具有内容控件,其中包含按DataTemplate类型自定义的多个TimeOFfset

只是一个想法......

答案 3 :(得分:0)

ViewModel旨在以视图可以使用的方式呈现模型。

在这种情况下,您可以为VM中的每个按钮设置一个布尔属性,当按钮更新时,只需将所有其他属性设置为false。然后在View中,您可以将每个属性IsChecked绑定到ViewModel中的相应属性。

另外,请注意WPF中的绑定单选按钮中当前存在bugHere's一个潜在​​的解决方案。

答案 4 :(得分:0)

你可以创建一个枚举,将枚举的值绑定到列表框,重新模板ListboxItems 这篇文章是使用silverlight,但类似的东西应该工作 http://leeontech.wordpress.com/2009/03/18/creating-radiobuttonlist/