代码之家  ›  专栏  ›  技术社区  ›  Matt Greer

让代码远离XAML代码的真正好处是什么?

  •  10
  • Matt Greer  · 技术社区  · 14 年前

    在Silverlight社区中,有很多工作可以让XAML的代码隐藏文件尽可能不包含代码。这背后真正的动机是什么?

    <Button x:Name="SaveButton" Content="Save" Click="SaveButton_Click" />
    
    ...
    
    private void SaveButton_Click(object sender, RoutedEventArgs e) {
        _myViewModel.SaveChanges();
    }
    

    那为什么要这样呢?

    <Button x:Name="SaveButton" Content="Save" Command="{Binding SaveCommand}" />
    

    SaveCommand SaveChanges() .

    这可能导致视图是100%XAML的情况,甚至在XAML中实例化视图模型,并且视图和视图模型之间的连接完全通过绑定完成。当然是干净的,但还有什么?灵活?为什么?视图仍然需要使用适当的ViewModel,因此如果两者之间的连接存在并且是隐式的,为什么不使其更显式呢?它还有一个缺点,就是失去编译时支持。如果我将我的按钮连接到一个不存在的事件处理程序,编译器会告诉我。如果我绑定到一个不存在的命令,它就不会。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Daniel Auger    14 年前

    它使单元测试和/或TDD更容易。通过使用MVVM和命令,我基本上可以构建我的视图模型和命令TDD样式,并测试大多数视图逻辑,而实际上根本没有XAML视图。

        2
  •  5
  •   Jack Ukleja    14 年前

    在这方面有很多努力 代码隐藏文件 可能吧。真正的动机是什么 幕后黑手?

    我想说的是,那些希望代码背后“尽可能免费”的人是那些没有真正理解MVVM潮流的人(要么你误解了他们的观点)。

    使用电脑有什么好处

    命令至少提供了两个事件处理程序没有的功能。一些WPF控件知道命令的CanExecute属性,因此例如,当命令不可执行时,可以禁用按钮。设计器和绑定框架也支持命令。

    你只需要在一个按钮上调用一个方法 使用命令而不是仅仅从事件处理程序调用方法的巨大优势。所以不要害怕使用这种方法(第三种方法是使用Blend(4)中的CallMethodAction,它更倾向于设计师而不是程序员。

        3
  •  1
  •   AnthonyWJones    14 年前

    可测试性 . 除非为ViewModel构建一个单元测试,否则ViewModel交付的很少,这反过来意味着您需要以这样一种方式创建ViewModel,即您可以使用依赖注入、IoC、blah、blah等技术对其进行单元测试。

    我不一定推荐它,正确地做它需要相当多的设计努力和前瞻性。因此,建立这种方法的成本相当高,然而,提高质量所节省的成本很可能抵消这些成本。

        4
  •  1
  •   Jeremy Likness    14 年前

    我看到的命令的主要优点是当您有执行一个操作的双重需求时 验证操作是否可以执行(即上下文)。换句话说,如果你只是简单地用一个直接的方法调用链接点击,我同意,我也看不到任何好处。但是,如果应该限制单击,并且根据上下文禁用按钮,那么绑定通过CanExecute属性促进这一点。

    这样,我们就不必担心视图中的控件(即逻辑上说“查找此控件,并将其设置为禁用,因为我们现在无法执行它”),我们可以创建一个命令并确保can execute返回false。这是独立于视图的可测试的,一旦绑定了它,绑定本身就负责管理控件的enabled属性。