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

db_*_*db_ 13 data-binding wpf mvvm

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

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

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

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

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

Jos*_*ose 9

本文讨论了您的问题的解决方案.

基本思想是创建一个静态(c#)类的ViewModel MetaData集,其中包含您可以在xaml中使用的ViewModel类属性的字符串值.本文介绍了如何使用T4文本生成来创建这些静态元数据类.您可以使用您偏好的任何代码生成工具.

所以你的VM有以下几点:

namespace Mine
{
  public class MyViewModel
  {
    public int MyInt {get;set;}
   public string MyString {get;set;}  
  }
}
Run Code Online (Sandbox Code Playgroud)

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

namespace Mine.MetaData
{
  public static class MyViewModelMetaData
  {
    public const string MyInt = "MyInt";
    public const string MyString = "MyString";
  }
}
Run Code Online (Sandbox Code Playgroud)

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

<TextBox Text="{Binding Path={x:Static Metadata:MyViewModelMetadata.MyInt}}"/>
Run Code Online (Sandbox Code Playgroud)

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

它很漂亮,我认为它很棒,它有机会让大多数人保持理智,但你的里程可能会有所不同.:)

编辑:

顺便说一句,我不买"ViewModels与视图紧密耦合".在我看来,视图与它们的ViewModel有着千丝万缕的联系,但它应该只是一种方式.ViewModels应完全独立于任何视图实现.它就像ViewModel是接口,View是具体实现的类.因此,我没有在我的ViewModel中添加任何特定于WPF的属性(例如,可见性枚举),因为这使我使用WPF永恒(这不是一件坏事:)),但它会影响维护.