Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在编译时验证XAML中的数据绑定_Wpf_Data Binding_Mvvm - Fatal编程技术网

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

Wpf 在编译时验证XAML中的数据绑定,wpf,data-binding,mvvm,Wpf,Data Binding,Mvvm,我正在开发基于WPF的应用程序。环境是带有.NET 3.5 SP 1的VS2008 SP1。 在我们的开发中,我们广泛使用MVVM模式 也就是说,应用程序开发人员编写模型和视图模型(C#),然后UI开发人员将使用WPF绑定(XAML)编写视图。应用程序开发人员也在ViewModels之上编写单元测试。 我们正在使用持续集成方法,我们正在构建并在每次修改中执行单元测试 问题在于缺乏XAML中数据绑定正确性验证的过程或工具。 例如: 应用程序开发人员编写属性NmberOfApples和单元测试以检查

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

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

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

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

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

    有许多可以证明是好的场景,实际上需要这种行为。在任何情况下,绑定都是通过设计来消除错误的,这也是您很难找到任何有助于解决此问题的方法的原因

    我见过的最好的一个异常验证处理程序将显示绑定错误:


    这样做的理由是视图和视图模型要解耦到一个视图可以用于多个视图模型的程度。它还有助于视图的“可弯曲性”,以便理论上设计师类型可以设计视图样式,而不会在设计过程中遇到一系列错误。我意识到这可能不符合您的流程,但事实就是这样。

    我同意前面的答案。这是“按设计”的,没有办法在编译时检查它

    我也觉得很痛苦

    我发现的最好也是唯一的方法是在运行时检查VisualStudio调试输出。打开包含绑定错误的窗口后,将立即打印该错误


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

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

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

    基本思想是创建一个静态(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}}"/>
    
    
    
    如果使用像这样的外接程序,那么它将为您提供关于静态类属性的智能感知,而且因为您正在引用静态类中的确切属性,当静态类重新生成时,您的xaml不应该编译

    它非常流畅,我认为它非常棒,有可能让大多数人保持理智,但你的里程可能会有所不同。:)

    编辑:

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

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

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


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


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

    我知道将View和ViewModel解耦很酷。这里的问题是,我如何验证他们的“兼容性”。是的。。。我知道那是你的问题。这是“可以论证的”。不幸的是,我认为您将不得不关注例外验证规则和自动化UI测试。我知道这有点糟糕。你建议手动浏览所有的应用程序窗口吗?这是一个很好的方法,谢谢你的指点。我将在几天内不回答这个问题,以防有人想分享其他技巧。@Jose如果在视图模型中不保留“可见性”之类的属性,