代码之家  ›  专栏  ›  技术社区  ›  db_

在编译时验证XAML中的数据绑定

  •  13
  • db_  · 技术社区  · 16 年前

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

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

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

    1. 应用程序开发人员写入属性 新苹果 和单元测试来检查它的正确行为
    2. UI开发人员创建用户控件并将其绑定到属性
    3. 应用程序开发人员发现该属性拼写错误,并将其名称修复为 苹果数
    4. 这将是任何C代码使用中的编译时错误 新苹果 属性,这样的错误很容易捕获(持续集成)
    5. XAML文件中的数据绑定将不被验证,它将是运行时错误

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

    6 回复  |  直到 9 年前
        1
  •  9
  •   Jose    16 年前

    本文讨论了解决问题的方法。 article .

    基本思想是创建一个静态(C)类的ViewModel元数据集,该元数据集包含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。

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

    编辑:

    顺便说一下,我不买“视图模型与视图紧密耦合”。在我看来,观点和他们的观点模型是密不可分的,但这应该只是一种方式。视图模型应该完全独立于任何视图实现。就像视图模型是接口,视图是具体实现的类。所以出于这个原因,我没有将任何特定于WPF的属性(例如可见性枚举)放入我的ViewModel中,因为这会使我永远无法使用WPF(这不是一件很糟糕的事情),但它会影响维护。

        2
  •  2
  •   Brian Hinchey    13 年前

    如果你安装 ReSharper ,您将获得的一个(许多)特性是“代码检查”。此检查将检测到的一个情况是绑定无法解析为数据上下文上的属性。您可以轻松筛选“检查结果”窗口,以仅显示这些问题。

    请注意,您必须在XAML资源中显式地声明视图模型的类型,这样才能工作。

    Example of ReSharper inspections

        3
  •  1
  •   Anderson Imes    16 年前

    有许多可以说是很好的场景,其中实际需要这种行为。在任何情况下,绑定都是通过设计来吞咽错误的,这也是您在查找任何有助于解决此问题的内容时遇到困难的原因。

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

    这一点的理由是视图,视图模型应该分离到一个视图可以用于多个视图模型的位置。它也有助于视图的“可弯曲性”,这样理论上,设计人员类型可以对视图进行样式设置,而不会在进行样式设置时遇到许多错误。我知道这可能不适合你的过程,但事实就是这样。

        4
  •  1
  •   John L.    9 年前

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

    但我还没有看到公认答案中所述的编译时错误。我甚至尝试使用[XamlCompilation(XamlCompilationOptions.Compile)]也没有用。如果我遗漏了什么,请纠正我的错误。

        5
  •  0
  •   db_    16 年前

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

        6
  •  -1
  •   Francesco De Vittori    16 年前

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

    我也觉得很痛。

    我找到的最好也是唯一的方法是在运行时检查Visual Studio调试输出。一旦打开包含绑定错误的窗口,将立即打印所有绑定错误。

    我同意如果你认为这是一个蹩脚和不可靠的方法,但它应该工作,如果你没有大量的窗口。您可以创建一个半正式的测试实践,在这个实践中,每隔一段时间打开一个专门查找绑定错误的窗口。