【问题标题】:Validate data binding in XAML in compile time在编译时验证 XAML 中的数据绑定
【发布时间】:2010-12-25 11:35:49
【问题描述】:

我正在开发基于 WPF 的应用程序。环境是带有 .NET 3.5 SP 1 的 VS2008 SP1。 在我们的开发中,我们广泛使用 MVVM 模式。

即应用程序开发人员编写模型和视图模型 (C#),然后 UI 开发人员将使用 WPF 绑定 (XAML) 编写视图。应用程序开发人员还在 ViewModel 之上编写单元测试。 我们正在使用持续集成方法,并且我们会在每次修改时构建和执行单元测试

问题在于 XAML 中缺少数据绑定正确性验证的流程或工具。 例如:

  1. 应用程序开发人员编写属性 NmberOfApples 和单元测试以检查其正确行为
  2. UI 开发人员创建用户控件并将其绑定到属性
  3. 应用开发者发现该属性有拼写错误并将其名称修复为 NumberOfApples
  4. 在任何使用 NmberOfApples 属性的 C# 代码中都会出现编译时错误,并且此类错误很容易捕获(持续集成)
  5. XAML 文件中的数据绑定不会被验证,会出现运行时错误

我的问题是“是否有任何工具或方法可以帮助我们在编译时验证 XAML 中数据绑定的正确性?”

【问题讨论】:

  • 我发现,我已经发布了您的问题的副本。 :( stackoverflow.com/questions/43208011/… 但是我已经成为了一个很好的解决方案!我不会在这里发布解决方案,因为它不是来自我,否则它会是抄袭。

标签: wpf data-binding mvvm


【解决方案1】:

最初的问题被提出和回答已经有好几年了,但正如我刚刚检查的那样,从那时起解决方案可能会变得更简单。 ReSharper 似乎提供了正确的 Intellisense,而无需生成已接受答案中提到的静态类。

但我没有目睹接受的答案中所述的编译时错误。我什至尝试使用 [XamlCompilation(XamlCompilationOptions.Compile)] 无济于事。如果我遗漏了什么,请纠正我。

【讨论】:

    【解决方案2】:

    如果您安装ReSharper,您将获得的(许多)功能之一是“代码检查”。此检查将检测到的一件事是您的绑定未解析为数据上下文中的属性的情况。您可以轻松过滤“检查结果”窗口以仅显示这些问题。

    请注意,您必须在 XAML 资源中明确声明视图模型的类型才能使其正常工作。

    【讨论】:

      【解决方案3】:

      article 讨论了您的问题的解决方案。

      基本思想是创建一个 ViewModel MetaData 静态(c#)类集,这些类保存 ViewModel 类属性的字符串值,然后您可以在 xaml 中使用这些值。本文解释了如何使用 T4 文本生成来创建这些静态元数据类。您可以使用任何您喜欢的代码生成工具。

      因此您的虚拟机具有以下内容:

      namespace Mine
      {
        public class MyViewModel
        {
          public int MyInt {get;set;}
         public string MyString {get;set;}  
        }
      }
      

      你的代码生成会创建这个:

      namespace Mine.MetaData
      {
        public static class MyViewModelMetaData
        {
          public const string MyInt = "MyInt";
          public const string MyString = "MyString";
        }
      }
      

      然后在您的 xaml 中,您将命名空间添加到您的 xaml 并将您的控件绑定到元数据类

      <TextBox Text="{Binding Path={x:Static Metadata:MyViewModelMetadata.MyInt}}"/>
      

      如果您使用像resharper 这样的加载项,那么它将为您提供有关静态类属性的智能感知,并且因为您正在引用静态类中的确切属性,当静态类重新生成时,您的 xaml 应该不编译。

      它非常漂亮,我认为它很棒,它有机会让大多数人保持清醒,但你的里程可能会有所不同。 :)

      编辑:

      顺便说一句,我不相信“ViewModels 与 Views 紧密耦合”。在我看来,视图与它们的视图模型有着千丝万缕的联系,但它应该只是一种方式。 ViewModel 应该完全独立于任何视图实现。这就像 ViewModel 是接口,而 View 是具体实现的类。因此,出于这个原因,我没有将任何特定于 WPF 的属性(例如 Visibility 枚举)放入我的 ViewModel 中,因为这使我必须永远使用 WPF(这并不是一件坏事 :)),但它会损害维护。

      【讨论】:

      • 这是一个很好的方法,谢谢你的指点。我将在几天内不回答这个问题,以防万一有人想分享其他技巧。
      • @Jose 如果在视图模型中不保留“可见性”等属性,由于无法在 XAML 中嵌入条件逻辑,如何更改 UI 组件的可见性?
      【解决方案4】:

      目前我们正在使用Caliburn 和本文Testing Bindings In WPF 中解释的方式进行单元测试。此解决方案的缺点是,UI 开发人员编写的代码仅用于验证绑定,如果 MS(或其他人)编写 XAML 验证编译器,则可以省略。

      【讨论】:

        【解决方案5】:

        我同意前面的回答。这是“设计使然”,无法在编译时进行检查。

        我也觉得这很痛苦。

        我发现最好也是唯一的方法是在运行时检查 Visual Studio 调试输出。任何绑定错误都会在您打开包含它的窗口后立即打印出来。

        如果您认为这是一种蹩脚且不可靠的方法,我同意,但如果您没有大量窗口,它应该可以工作。您可以创建一个半正式的测试实践,偶尔打开任何窗口专门查找绑定错误。

        【讨论】:

        • 您是否建议手动遍历所有应用程序窗口?
        【解决方案6】:

        有许多可以说是好的场景实际上是需要这种行为的。在任何情况下,绑定都是通过设计来吞下错误的,这也是您找不到任何可以帮助您解决此问题的任何东西的原因。

        我见过的最好的东西是一个异常验证处理程序,它将显示绑定错误: http://msdn.microsoft.com/en-us/library/system.windows.controls.exceptionvalidationrule.aspx

        对此的论点是视图,而 ViewModel 旨在解耦到一个 View 可用于多个 ViewModel 的地步。它还有助于视图的“可弯曲性”,因此理论上设计师类型可以设置视图样式,而不会在执行时遇到一堆错误。我知道这可能不适合您的流程,但就是这样。

        【讨论】:

        • 我知道 View 和 ViewModel 解耦很酷。这里的问题是,我如何验证它们的“兼容性”。
        • 是的...我知道这是你的问题。那是“可以说”。不幸的是,我认为您可能不得不关注 ExceptionValidationRule 和自动化 UI 测试。我知道这有点糟糕。
        猜你喜欢
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        相关资源
        最近更新 更多