【问题标题】:MVVM restricts Code Behind?MVVM 限制代码背后?
【发布时间】:2012-06-02 13:28:33
【问题描述】:

在 WPF 中使用 MVVM 模型是否会限制程序员在后面编写代码?避免 Code behind 会导致很多复杂性,但另一方面,耦合会成为一个问题。那么什么更好呢?

【问题讨论】:

    标签: wpf mvvm code-behind


    【解决方案1】:

    MVVM 模型不会限制您编写代码。

    它所提倡的是 View 应该只依赖于 ViewModel(以及 Model 上的 ViewModel)

    因此,如果您在其背后编写代码实际上是在实现 ViewModel,那么您就是在创建从 ViewModel 到 View 的依赖关系。

    仅查看相关内容的代码是可以的

    使用后面的代码时你失去的东西是该代码的简单(单元)测试。

    编辑

    MVVM 世界中的一个常见表达是“仅 XAML”。尽管我很喜欢简短而活泼的陈述,但它往往会偏离 MVVM 试图解决的实际问题以及它试图解决它的方式。

    只要你坚持让 View 依赖于 ViewModel 和 Model 上的 ViewModel 并努力实现(单元)可测试性,你就走在了正确的轨道上。

    编辑 2

    在处理事件的视图中应该只做两件事:改变视图本身或使用绑定通知视图模型发生了变化。应通过在 ViewModel 上实现 INotifyPropertyChanged 来将 ViewModel 中的更改通知给 VIEW。

    以类似的方式,ViewModel 可以通过将 ViewModel 命令绑定到视图来响应视图中的事件。

    WPF 按钮有一个可以使用的 Command 属性。单击按钮时执行。

    如果控件没有 Command 属性,或者您想在引发不同事件时执行命令,您所要做的就是将事件转换为 ICommand 的执行。

    Microsoft 已经在 Blend SDK 中提供了一个实现。 From this article:

    ... xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity..."
    <Slider
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="ValueChanged">
                <i:InvokeCommandAction Command="{Binding MyCommand}"
                                       CommandParameter="{Binding Text, ElementName=textBox}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Slider>
    

    And a discussion about commands versus event triggers

    【讨论】:

    • 在我看来,使用 MVVM 的基本需求是使视图独立于实际实现(视图模型),但在某些情况下,依赖因素如此之多,以至于必须使用后面的代码,例如实施事件。如果使用后面的代码,那么耦合因素可能会受到阻碍,因为 View 会变得有些健壮。
    • @phoenix 这似乎有点落后 MVVM 用于断开 ViewModel 逻辑与 View 的连接,以便您可以测试 ViewModel。依赖关系必须在某些时候存在,在这种模式下,视图依赖于 ViewModel(或 ViewModel 的接口)。
    • 在处理事件的视图中应该只做两件事:改变视图本身或使用绑定通知视图模型发生了变化。
    • 通知视图模型可以使用 INotifyPropertyChanged 来完成,但是对于像点击事件这样的事件,这个过程有点繁琐,因为在 MVVM 的情况下你的代码中不能有处理程序。如果我错了,请纠正我:)
    • 您所要做的就是将事件转换为 ICommand 的执行。 Microsoft 已经在 Blend SDK 中提供了一个实现。见blogs.msdn.com/b/luc/archive/2010/11/18/…blog.tonysneed.com/2011/07/22/…
    猜你喜欢
    • 2016-10-23
    • 2013-06-03
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2011-03-21
    • 1970-01-01
    相关资源
    最近更新 更多