一、简介

CommunityToolkit.Mvvm 是 .NET 社区工具包中的一部分,它提供了一组用于实现 MVVM(Model - View - ViewModel)模式的工具和特性。MVVM 模式是一种前端开发模式,通过分离视图(View)和业务逻辑(ViewModel),提高代码的可维护性和可测试性。CommunityToolkit.Mvvm 简化了 MVVM 模式的实现,提供了属性更改通知、命令绑定等常见功能的便捷实现方式。

二、原理

MVVM 模式概述

MVVM 模式主要由三个部分组成:

  • Model:表示应用程序的数据和业务逻辑,通常是实体类和数据访问层。
  • View:负责用户界面的展示,如 XAML 页面、HTML 页面等。
  • ViewModel:作为 Model 和 View 之间的桥梁,处理业务逻辑和数据转换,并提供视图可以绑定的数据和命令。

CommunityToolkit.Mvvm 的作用

CommunityToolkit.Mvvm 主要解决了 MVVM 模式中的两个核心问题:

  • 属性更改通知:当 ViewModel 中的属性值发生变化时,通知 View 进行更新。
  • 命令绑定:实现 View 中的用户交互(如按钮点击)与 ViewModel 中的业务逻辑的绑定。

三、实现机制

属性更改通知

CommunityToolkit.Mvvm 通过 ObservableObject 类和 [ObservableProperty] 特性实现属性更改通知。ObservableObject 类实现了 INotifyPropertyChanged 接口,当属性值发生变化时,会触发 PropertyChanged 事件通知 View。[ObservableProperty] 特性是一个源生成器,它会自动生成属性的 get 和 set 方法,并在 set 方法中触发 PropertyChanged 事件。

命令绑定

CommunityToolkit.Mvvm 提供了 RelayCommand 类来实现命令绑定。RelayCommand 类封装了一个 ActionFunc<bool> 委托,分别表示命令的执行逻辑和命令是否可执行的判断逻辑。在 View 中,可以将按钮等控件的 Command 属性绑定到 ViewModel 中的 RelayCommand 实例。

四、安装

可以通过 NuGet 包管理器安装 CommunityToolkit.Mvvm

Install-Package CommunityToolkit.Mvvm

或者在 .NET CLI 中使用以下命令:

dotnet add package CommunityToolkit.Mvvm

五、代码示例

1. 属性更改通知

using CommunityToolkit.Mvvm.ComponentModel;
// 继承 ObservableObject 类
public partial class MyViewModel : ObservableObject
{
    // 使用 [ObservableProperty] 特性自动生成属性
    [ObservableProperty]
    private string _name;
    // 可以使用 OnPropertyChanged 方法手动触发属性更改通知
    public void UpdateName()
    {
        Name = "New Name";
    }
}

2. 命令绑定

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
public partial class MyViewModel : ObservableObject
{
    [ObservableProperty]
    private string _message;
    // 创建 RelayCommand 实例
    public RelayCommand UpdateMessageCommand { get; }
    public MyViewModel()
    {
        // 初始化 RelayCommand,传入执行逻辑
        UpdateMessageCommand = new RelayCommand(UpdateMessage);
    }
    private void UpdateMessage()
    {
        Message = "Message updated!";
    }
}

3. 带参数的命令

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

public partial class MyViewModel : ObservableObject
{
    [ObservableProperty]
    private string _selectedItem;
    // 创建带参数的 RelayCommand 实例
    public RelayCommand<string> SelectItemCommand { get; }
    public MyViewModel()
    {
        // 初始化 RelayCommand,传入带参数的执行逻辑
        SelectItemCommand = new RelayCommand<string>(SelectItem);
    }
    private void SelectItem(string item)
    {
        SelectedItem = item;
    }
}

4. 可执行判断的命令

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
public partial class MyViewModel : ObservableObject
{
    [ObservableProperty]
    private int _count;
    // 创建带可执行判断的 RelayCommand 实例
    public RelayCommand IncrementCommand { get; }
    public MyViewModel()
    {
        // 初始化 RelayCommand,传入执行逻辑和可执行判断逻辑
        IncrementCommand = new RelayCommand(IncrementCount, CanIncrement);
    }
    private void IncrementCount()
    {
        Count++;
        // 当属性变化可能影响命令可执行性时,调用 NotifyCanExecuteChanged 方法
        IncrementCommand.NotifyCanExecuteChanged();
    }
    private bool CanIncrement()
    {
        return Count < 10;
    }
}

5. 在 XAML 中使用

以下是一个简单的 WPF 示例,展示如何在 XAML 中绑定 ViewModel 的属性和命令:

<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <!-- 绑定属性 -->
            <TextBox Text="{Binding Name}" Margin="10"/>
            <Button Content="Update Name" Command="{Binding UpdateNameCommand}" Margin="10"/>
            <!-- 绑定带参数的命令 -->
            <Button Content="Select Item" Command="{Binding SelectItemCommand}" CommandParameter="Item 1" Margin="10"/>
            <!-- 绑定可执行判断的命令 -->
            <Button Content="Increment" Command="{Binding IncrementCommand}" Margin="10"/>
        </StackPanel>
    </Grid>
</Window>
using System.Windows;
namespace MyApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            // 设置 DataContext 为 ViewModel 实例
            DataContext = new MyViewModel();
        }
    }
}

六、总结

CommunityToolkit.Mvvm 提供了简单而强大的工具来实现 MVVM 模式,通过源生成器和便捷的类库,大大简化了属性更改通知和命令绑定的实现。希望这份说明书能帮助新手快速上手 CommunityToolkit.Mvvm