2009-12-10 60 views
13

我正在开发基于WPF的应用程序。环境是使用.NET 3.5 SP 1的VS2008 SP1。 在我们的开发中,我们广泛使用MVVM模式。在编译时验证XAML中的数据绑定

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

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

  1. 应用开发者编写属性NmberOfApples和单元测试,以检查它的正确的行为
  2. UI开发者创建用户控制,并将其绑定到属性
  3. 应用开发者发现,性能有拼写错误和修复它的名字NumberOfApples
  4. 这将是汇编时间错误在任何C#代码使用NmberOfApples属性,并且这样的错误将b E容易赶上(持续集成)
  5. 数据XAML文件中的结合不会被验证,它将会运行时错误

我的问题将是“有没有帮助我们进行验证的任何工具或方法XAML在编译时的数据绑定正确性?“

+0

我已经发现,我已经发布了您的问题的副本。 :( http:// stackoverflow。com/questions/43208011/detect-in-xaml-broken-bindings-already-at-compile-time 但是我已经成为一个很好的解决方案!我不会在这里发布解决方案,因为它不是来自我的,否则就是剽窃。 – Rekshino 2017-04-28 06:41:55

回答

9

您的问题的解决方案在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有着不可分割的联系,但它只能是一种方式。 ViewModels应该完全独立于任何视图实现。这就像ViewModel是接口,View是具体的实现类。所以出于这个原因,我没有把任何WPF特有的属性(例如,可见性枚举)放到我的ViewModel中,因为这会绑定我使用永久的WPF(这不是一件坏事:)),但它会影响维护。

+1

这是伟大的方法,谢谢你指出它。我会继续解决这个问题几天,以防万一有人想分享其他技巧。 – 2009-12-18 18:15:27

+0

@Jose如果你没有在视图模型中保留“visibility”等属性,你怎么改变UI组件的可见性,因为你不能在XAML中嵌入条件逻辑? – 2016-09-04 19:04:29

1

有许多可以说是很好的场景,其中这种行为实际上是所需的。在任何情况下,它的设计都是绑定吞下错误,这就是你无法找到任何有助于解决这个问题的原因。

我见过的最好的事情是个例外验证处理程序,将显示绑定错误: http://msdn.microsoft.com/en-us/library/system.windows.controls.exceptionvalidationrule.aspx

这样做的理由是观点和的ViewModels是为了去耦,其中可以使用的角度来看对于多个ViewModels。它还有助于视图的“可弯曲性”,因此理论上设计器类型可以设计视图而不会在执行视图时遇到大量错误。我意识到这可能不适合你的过程,但这就是故事。

+0

我知道让View和ViewModel解耦是很酷的。这里的问题,我如何验证他们的“兼容性”。 – 2009-12-11 18:30:49

+0

是的...我知道那是你的问题。那是“可以说”的。不幸的是,我认为你将不得不专注于ExceptionValidationRule可能的和自动化的UI测试。我知道这有点蹩脚。 – 2009-12-11 19:04:07

-1

我同意上一个答案。这是“按设计”,无法在编译时检查它。

我也发现它很痛苦。

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

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

+0

您是否建议手动遍历所有应用程序窗口? – 2009-12-15 18:31:16

0

目前我们使用Caliburn和单元测试的方式在本文中解释Testing Bindings In WPF。这个解决方案的缺点是,UI开发人员编写的代码只能验证绑定,如果MS(或某人)会编写XAML验证编译器,则可以省略该代码。

2

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

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

Example of ReSharper inspections

1

它已经多年,因为原来的问题被提出和回答,但正如我刚才检查,该解决方案可能会变得从那时起简单。 ReSharper似乎提供了正确的Intellisense,而无需生成接受的答案中提到的静态类。

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