经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
使用MVVM Toolkit简化WPF开发
来源:cnblogs  作者:波多尔斯基  时间:2023/11/17 9:19:06  对本文有异议

最近. NET 8 的 WPF 推出了 WPF File Dialog改进,这样无需再引用 Win32 命名空间就可以实现文件夹的选择与存储了,算是一个很方便的改进了。顺手写了一个小的 WPF 程序,在使用 Model-View-ViewModel(MVVM) 模式的时候,我不想使用 Prism 等重量级的框架,找了一个轻量级的 MVVM Community Toolkit (以下简称 MVVM Toolkit)。

在现代 WPF 应用程序开发中,遵循 MVVM(Model-View-ViewModel)模式已成为一种标准做法。MVVM 模式视图和逻辑分离,提高了代码的可测试性、可维护性。

MVVM Toolkit 核心功能

MVVM Toolkit 提供了一系列的功能,使得在 WPF 等程序中实现 MVVM 更加简单。

  1. ViewModel 基类:基类(例如 ObservableObject)为实现属性更改通知提供了基础结构,简化了 ViewModel 的创建过程。
  2. 命令的实现:MVVM Toolkit 提供了易于使用的命令实现(RelayCommand ),允许 View 以声明方式绑定到 ViewModel 上的方法。
  3. 弱消息机制:弱消息机制(WeakReferenceMessenger)允许不同对象之间收发消息,而不会造成内存泄漏。

安装

使用 nuget 安装到 WPF 项目中即可。由于 MVVM Toolkit 面向. NET Standard,所以可在任何应用平台上使用:UWP、WinForms、WPF、Xamarin、Uno 等。

  1. Install-Package CommunityToolkit.Mvvm

代码生成

在 MVVM Toolkit 中,代码生成器扮演着重要的角色。通过利用代码生成器,它能够自动化诸如属性更改通知和命令实现等常见任务,减少样板代码,提高开发效率。

例如,开发者可以通过简单的属性标记,自动实现 INotifyPropertyChanged 接口:

  1. partial class MyViewModel : ObservableObject
  2. {
  3. [ObservableProperty]
  4. private string name;
  5. [ObservableProperty]
  6. private bool isEnabled;
  7. }

以上代码会通过 Roslyn 的代码生成器功能生成如下代码:

  1. partial class MyViewModel
  2. {
  3. public string Name
  4. {
  5. get => name;
  6. set => SetProperty(ref name, value);
  7. }
  8. public bool IsEnabled
  9. {
  10. get => isEnabled;
  11. set => SetProperty(ref isEnabled, value);
  12. }
  13. }

在没有 MVVM Toolkit 的情况下,开发者需要手动实现 MVVM 的各个部分。例如,实现 INotifyPropertyChanged 接口通常涉及创建大量样板代码:

  1. public class MyViewModel : INotifyPropertyChanged
  2. {
  3. private string myProperty;
  4. public string MyProperty
  5. {
  6. get => myProperty;
  7. set
  8. {
  9. myProperty = value;
  10. OnPropertyChanged(nameof(MyProperty));
  11. }
  12. }
  13. public event PropertyChangedEventHandler PropertyChanged;
  14. protected virtual void OnPropertyChanged(string propertyName)
  15. {
  16. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  17. }
  18. }

相比之下,MVVM Toolkit 不仅减少了需要编写的代码量,也降低了出错的可能性,使得开发更加专注于业务逻辑本身。

使用 MVVM Toolkit 创建 ViewModel

依赖属性与命令

以下是使用 MVVM Toolkit 创建 ViewModel 的一个简单示例:

  1. public partial class MainViewModel : ObservableObject
  2. {
  3. [ObservableProperty]
  4. private string title = "Hello, MVVM Toolkit!";
  5. [RelayCommand]
  6. private void DealWithData()
  7. {
  8. // 数据处理逻辑
  9. }
  10. }

ObservablePropertyRelayCommand 属性标记自动处理了属性更改通知和命令实现的细节,开发者只需关注业务逻辑,并在 XAML 中绑定对应的属性/命令,组件会自动生成对应的依赖属性。

注意,请一定使用 camelCase 命名法(可以带前导_),代码生成器会生成符合 PascalCase 标准的属性/方法名称。

弱引用消息

再看 WeakReferenceMessenger 在不同 ViewModel 或组件间发送和接收消息:

1. 定义消息类型

首先定义一个消息类型。消息可以是任何类或结构,通常包含发送者想要传递的数据:

  1. public class MyMessage
  2. {
  3. public string Text { get; }
  4. public MyMessage(string text)
  5. {
  6. Text = text;
  7. }
  8. }

2. 发送消息

在一个 ViewModel 或组件中,你可以发送消息。假设有一个 SenderViewModel

  1. public class SenderViewModel
  2. {
  3. private void SendMessage()
  4. {
  5. var message = new MyMessage("Hello from SenderViewModel");
  6. WeakReferenceMessenger.Default.Send(message);
  7. }
  8. }

SendMessage 方法创建了一个 MyMessage 实例,并通过 WeakReferenceMessenger.Default.Send 方法发送。

3. 接收消息

在另一个 ViewModel 或组件中,你可以注册以接收特定类型的消息。例如,你可能有一个 ReceiverViewModel

  1. public class ReceiverViewModel
  2. {
  3. public ReceiverViewModel()
  4. {
  5. // 注册以接收 MyMessage 类型的消息
  6. WeakReferenceMessenger.Default.Register<MyMessage>(this, (recipient, message) =>
  7. {
  8. // 处理接收到的消息
  9. string receivedText = message.Text;
  10. // Do something with receivedText
  11. });
  12. }
  13. }

ReceiverViewModel 的构造函数中,使用 WeakReferenceMessenger.Default.Register 方法注册了消息接收器,当发送方发送 MyMessage 类型的消息时,这个接收器将被调用。

4. 解除消息注册

在不再需要接收消息时,或者在对象被销毁之前,应该解除消息的注册,以避免内存泄漏:

  1. public class ReceiverViewModel
  2. {
  3. public ReceiverViewModel()
  4. {
  5. WeakReferenceMessenger.Default.Register<MyMessage>(this, OnMessageReceived);
  6. }
  7. private void OnMessageReceived(object recipient, MyMessage message)
  8. {
  9. // 处理消息
  10. }
  11. ~ReceiverViewModel()
  12. {
  13. WeakReferenceMessenger.Default.Unregister<MyMessage>(this);
  14. }
  15. }

ReceiverViewModel 通过其析构函数取消注册(也可以使用 IDispose 实现),确保当 ViewModel 被回收时,不会有消息处理器的引用残留。

总结

MVVM Toolkit 为 WPF 开发者提供了一个强大且易用的工具,它极大地简化了 MVVM 模式实现过程,虽然其他框架(MVVM Light/Prism 等)也提供了类似功能,但它非常轻量,使用简单,非常适合小型工程使用。

本文使用 AI 帮助润色了部分内容,文章经过人工校对。

原文链接:https://www.cnblogs.com/podolski/p/17837072.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号