我正在使用PRISM(因此也就是MVVM模式)。我有一个带有单选按钮的复杂DateTime选择器视图。 用户可以选择今天,昨天,一个日期,一年中的一周等。我使用单选按钮进行不同的选择。
MVVM中最好的方法是什么? 我真的想不出干净的方式。我可以创建许多自定义行为来添加到每个项目以跟踪它们,但它似乎不可维护。
我将放置一些代码隐藏但我真的不喜欢这样,对我来说它打破了MVVM原则(将所有内容都放在XAML中)。
有没有人对如何解决这个问题有更好的了解?
答案 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
属性的TimeOfset
(WeekCount
的子类)具有内容控件,其中包含按DataTemplate
类型自定义的多个TimeOFfset
。
只是一个想法......
答案 3 :(得分:0)
ViewModel旨在以视图可以使用的方式呈现模型。
在这种情况下,您可以为VM中的每个按钮设置一个布尔属性,当按钮更新时,只需将所有其他属性设置为false。然后在View中,您可以将每个属性IsChecked绑定到ViewModel中的相应属性。
答案 4 :(得分:0)
你可以创建一个枚举,将枚举的值绑定到列表框,重新模板ListboxItems 这篇文章是使用silverlight,但类似的东西应该工作 http://leeontech.wordpress.com/2009/03/18/creating-radiobuttonlist/