在 (XAML) Silverlight 4 或 WPF 中使用 MvvmLight






2.94/5 (8投票s)
如何开始使用 MVVMLight 和 XAML 进行单元测试。
引言
本教程将尝试解释在 XAML 应用程序中使用 MVVMLight 的优势以及“如何操作”,以便您能够编写可维护、更重要的是可测试的代码。
为什么使用 MVVM 模式
多年来,GUI 与代码隐藏的紧密耦合意味着测试代码隐藏可能有些棘手。在其中,如何模拟 GUI 中的选定事件来调用绑定的事件代码?您可以模拟对事件代码的调用,但是如何从(GUI 中)不存在的组合框中获取选定的项,因为您没有运行 GUI,而是在测试 GUI 使用的方法?所需的是 GUI 和代码隐藏之间的松散耦合,这就是上下文类发挥作用的地方——XAML(Silverlight 或 WPF)有一个概念,其中 Silverlight 页面可以关联一个(上下文)类来处理其事件,并且还(更重要的是)将设置器和获取器与 GUI 控件的绑定关联起来。因此,当属性通过其设置器更新时,对 `INotifyPropertyChanged` 类中的 `NotifyPropertyChanged` 方法的调用将触发重新绑定到控件。
安装并集成 MVVMLight 到您的项目
您可以在此处从 Gala 的网站下载并按照说明进行操作:http://www.galasoft.ch/mvvm/getstarted/。
或者
- 获取 NUGet(Visual Studio 的便捷插件 - http://nuget.codeplex.com/releases),将您的应用程序转换为 MVVMLight 应用程序。
- 如何在 VS2010 中集成 NUGet:http://nuget.codeplex.com/wikipage?title=Using%20the%20Extension%20Manager%20to%20Install%20the%20Library%20Package%20Manager%20(NuGet)。
- 如何将 MVVMLight DLL 添加到您的项目:http://nuget.codeplex.com/wikipage?title=Finding%20and%20Installing%20a%20Package%20Using%20the%20Add%20Library%20Package%20Reference%20Dialog%20Box(在本教程中,搜索 MVVMLight)。
- 使用此教程作为向您的项目添加 DLL 的指南:http://insomniacgeek.com/nuget-packages-for-mvvm-light/
以下是如何在安装 NUGet 并运行 MVVMLight 安装程序后将您的项目转换为 MVVMLight 项目
绑定场景
Commands
命令基本上是一个事件在 GUI 中发生时的参考点。将触发相应的命令(在 XAML 中设置)。在任何 MVVM 设计模式中,都有一个 RelyCommand 会确定命令的关联方法是否可以执行。下面,您可以看到按钮的命令属性已绑定到上下文类中的“ButtonCommand
”命令——从而将(按钮点击)事件连接到代码中的此命令——该命令又将调用一个方法来执行该命令。
向命令传递参数
使用 `System.Windows.Interactivity` 类的引用,可以向调用的命令传递参数(同样,也有一个 RelyCommand 用于此类传递)。下面,触发器是文本框的“SelectionChanged
”事件,它将使用文本框内容的参数调用“LstBoxChangedCommand
”命令。
RelyCommand(包括传递回参数)
RelyCommand 将确定命令的关联方法是否可以执行。RelyCommand 有一些重载,您可以带参数或不带参数调用 RelyCommand。基本上,每个版本(带参数或不带参数)都有两个可以调用的方法。唯一的区别(除了期望参数外)是您可以调用一个“canExecute
”方法来确定命令是否有效以继续处理。还有一个不带“canExecute
”的 RelyCommand 方法,它将始终触发命令的关联方法。例如,您可能希望 `ComboBox` 的 `SelectedItemChanged` 事件始终触发,因为您不依赖页面上的任何其他控件/场景。在下面的两个图像中,您可以看到 MVVMLight RelayCommand 方法的对象浏览器视图——第一个不带参数,但第二个图像显示了带参数的 Relaycommand 的签名。
在 XAML 中绑定 Setter 属性
将绑定与上下文类中的 setter 属性关联(这将是双向的,以便更改可以回传到控件——单向意味着控件告诉属性它已更改)。在下面的图像中,您可以看到 `SelectedItem` 已绑定到属性“SelectedTemplate
”——这是 `ObservableCollection` 中一个类的引用。
MVVM NotifyPropertyChanged 方法
通过上述双向绑定,我可以更改属性(也许在与命令关联的方法中);例如,我从组合框中选择了一个项目——这会触发一个命令,与该命令关联的方法然后设置一个绑定到标签的属性——该标签使用“NotifyPropertyChanged
”方法会将更新回传到标签。
在 XAML 中绑定事件属性
开发人员希望将许多 GUI 控件事件绑定回上下文类中的命令。这可以使用“System.Windows.Interactivity
”类来实现。我们可以将组合框中的任何事件(例如)绑定回上下文类中的命令——要获取组合框中的选定项,我们通常会将参数传递给命令。这里有一个注意事项,即 `SelectionChanged` 事件在 `SelectedItem` 绑定发生之前触发——在这种情况下,我们会将 `SelectedItem` 传递给命令。知道这种情况会发生,但也知道我们可以解决这个问题,这只能扩展 MVVM 设计模式的用途。基本上,一个事件不能被触发到另一个类中的命令并被执行。再次查看此图像,您可以看到我正在绑定到文本框中的一个事件——SelectionChanged
。现在您可以绑定到控件拥有的任何事件。
引发一个单独的命令来执行(在另一个命令方法内)
当您在更改属性后需要另一个事件/命令触发,或者需要触发到另一个单独的事件时,这种情况会发生——这可以通过使用 `RaiseCanExecuteChanged` 方法来评估您希望执行的相应命令来实现。
示例应用
此应用程序需要添加 MvvmLight DLL(因为它们使项目 zip 后的大小超过 11 MB)。如果您遵循介绍中使用 NUGet 的说明,您可以轻松添加 DLL。
示例代码基本上会验证用户在(文本框中)输入的内容是否与组合框匹配,以启用或禁用按钮(有效输入是指尚未在组合框中的内容)。
单元测试 MVVM 代码
在上面的可下载项目中,我创建了一些可以应用于 MVVM 上下文类的测试。因此,我可以在我的测试夹具中模拟将在 XAML 中发生的“KeyDown
”事件。