WinUI 中的数据绑定、依赖项注入和单元测试

本教程系列演示如何使用 WinUI 3 应用中的模型View-ViewModel(MVVM)设计模式和 MVVM 工具包 实现数据绑定、依赖项注入和单元测试。 它基于 “创建 WinUI 应用 ”教程,演示如何更新视图模型以利用 MVVM 工具包和 MVVM 工具包与传统 MVVM 方法之间的差异。

可以从 GitHub 存储库下载或查看本教程的代码。

本教程中,您将学习如何:

  • 了解 MVVM 工具包与传统 MVVM 方法之间的差异。
  • 创建单独的类库项目来保存 ViewModel 和服务以提高可测试性。
  • 使用 MVVM 工具包在 WinUI 应用中实现数据绑定。
  • 添加 AllNotesViewModelNoteViewModel 视图模型以充分利用 MVVM 工具包。
  • 集成依赖项注入以管理 ViewModel 和服务。
  • 创建单元测试项目以测试 ViewModels 和服务。

先决条件

若要完成本教程,需要具备以下先决条件:

什么是 MVVM 工具包?

MVVM 工具包是一种新式、轻型且快速的库,可帮助你在 .NET 应用程序中实现 MVVM 设计模式。 它是 .NET 社区工具包 的一部分,提供一组工具和实用工具来简化基于 MVVM 的应用程序的开发。 MVVM 工具包包括以下功能:

  • ObservableObject:实现接口的 INotifyPropertyChanged 基类,因此可以创建通知属性更改视图的视图模型。
  • RelayCommand:一种命令实现类,可用于将 UI 操作绑定到视图模型中的方法。
  • Messenger:一种消息传递系统,用于在应用程序的不同部分之间实现通信,而无需紧密耦合。
  • 属性:一组可用于生成样板代码的属性,例如属性更改通知和命令实现。
  • 源生成器:编译时代码生成,可减少样板并提高性能。
  • 依赖项注入支持:对依赖项注入的内置支持,用于管理视图模型和服务生命周期。

MVVM 工具包设计为易于使用并集成到现有项目中。 它与各种 .NET 平台(包括 WinUI、WPF 和 .NET MAUI)兼容。 可以查看 GitHub 存储库 上的一些示例应用或 Microsoft 应用商店上的 示例应用 ,了解 MVVM 工具包在不同方案中的使用方式。

MVVM 工具包与传统 MVVM 方法相比如何?

与传统方法相比,MVVM 工具包减少了样本 ViewModel 代码的数量,并简化了实现 MVVM 设计模式的许多方面。 下面是一些主要差异:

功能 / 特点 传统的 MVVM 方法 MVVM 工具包方法论
属性更改通知 在基类中手动实现 INotifyPropertyChanged 并为每个属性引发 PropertyChanged 事件。 继承ObservableObject并使用SetProperty方法来自动触发PropertyChanged事件。
命令实现 为每个命令手动实现 ICommand 使用 RelayCommand 可以轻松创建具有最少模板代码的命令。
Messaging 实现自定义消息传送系统或使用第三方库。 使用内置 Messenger 类在组件之间分离通信。
模板代码 为属性更改通知和命令实现编写重复代码。 使用属性和源生成器减少样本代码。
Performance 由于反射和运行时代码生成,可能会导致性能开销。 源生成器提供编译时代码生成,从而提高性能。
依赖注入支持 需要手动设置和管理视图模型生命周期。 内置支持依赖注入,用于管理视图模型的生命周期。
学习曲线 可能需要更深入地了解 MVVM 概念和模式。 更容易学习和使用,专注于简单性和工作效率。

要了解更多关于 MVVM 设计模式的背景信息,请参阅Windows 数据绑定和 MVVM模型-视图-视图模型(MVVM)以及INotifyPropertyChanged 接口的参考文档。

WinUI Notes 应用

本教程中生成的最后一个应用程序是 “创建 WinUI 应用 ”教程中 WinUI Notes 应用的重构版本。 应用允许用户创建、保存和加载多个笔记。 原始应用的用户界面保持不变,但更新的体系结构使用 MVVM 工具包进行数据绑定和查看模型管理。

AllNotesPage

WinUI Notes 应用的屏幕截图,其中显示了 AllNotesPage 视图中的三个已保存笔记。

NotePage

WinUI Notes 应用的屏幕截图,其中显示了 NotePage 视图中的空白备注页。

小窍门

生成 Windows 应用时,通常参考 API 参考文档和概念文档。在本教程中,你将在文本中看到内联链接,以及标记为“在 docs 中了解详细信息”的组中的链接。 这些链接是可选的;无需遵循它们即可完成本教程。 如果要记下开始创建自己的应用时所需的信息的位置,则会提供它们。