【问题标题】:Howto RadioButtons and MVVM pattern如何使用单选按钮和 MVVM 模式
【发布时间】:2010-11-14 14:48:42
【问题描述】:

我正在使用 PRISM(以及 MVVM 模式)。我有一个带有单选按钮的复杂日期时间选择器视图。 用户可以选择今天、昨天、日期、一年中的一周等。我使用单选按钮来进行不同的选择。

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

我将在后面添加一些代码,但我真的不喜欢这样,而且对我来说它违反了 MVVM 原则(将所有内容都放在 XAML 中)。

有没有人对如何去做有更好的想法?

【问题讨论】:

    标签: wpf silverlight xaml silverlight-3.0 mvvm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      把它放在代码后面。

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

      将 View 逻辑放入 ViewModel 不是一个好主意,因为您现在正在向 VM 提供有关 View 工作原理的知识。流程意味着 View 知道 ViewModel,ViewModel 知道 Model。反之亦然。 (与所有与计算机相关的事物一样,总会有例外)

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

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

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

        另外,请注意当前有一个bug 用于绑定 WPF 中的单选按钮。 Here's 一个潜在的解决方案。

        【讨论】:

        • 哇,我很久以前就发布了这个错误,但我没有意识到它得到了如此多的关注;)请注意,它在 .NET 4 中已修复。
        • @JC 所以你有责任! :P
        【解决方案4】:

        使用ComboBox 而不是RadioButtons 来显示绑定到您的ViewModel 的TimeOffset(自定义类)列表以及相应的SelectedTimeOffest 属性怎么样。
        如果您需要根据TimeOffset 的类型显示额外信息,例如一个带有WeekCount 属性的WeekOffsetTimeOfset 的子类),有一个带有多个DataTemplates 的内容控件,由TimeOFfset 的类型自定义。

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2018-12-05
            • 1970-01-01
            • 2010-10-27
            • 2016-04-04
            • 2011-02-12
            • 2011-03-29
            • 1970-01-01
            • 1970-01-01
            • 2017-07-11
            相关资源
            最近更新 更多