CommunityToolkit.Mvvm:简化C# MVVM开发的利器

CommunityToolkit.Mvvm 是 .NET 平台上的一个现代、快速且模块化的 MVVM 库,旨在简化 MVVM 模式的应用开发。本文将系统梳理其核心功能、高级特性及最佳实践,帮助开发者高效构建 MVVM 应用

核心功能

属性通知 (ObservableProperty)

自动生成 INotifyPropertyChanged 代码,避免手动编写样板代码

using CommunityToolkit.Mvvm.ComponentModel;

public partial class MyViewModel : ObservableObject
{
    [ObservableProperty]
    private string name; // 自动生成 Name 属性,包含变更通知
}
<TextBlock Text="{Binding Name}" />

命令 (RelayCommand)

简化 ICommand 的实现,支持同步和异步操作。

using CommunityToolkit.Mvvm.Input;

public partial class MyViewModel : ObservableObject
{
    [RelayCommand]
    private void SayHello() => MessageBox.Show("Hello!");

    [RelayCommand]
    private async Task LoadDataAsync()
    {
        await Task.Delay(1000); // 模拟异步操作
    }
}
<Button Content="Say Hello" Command="{Binding SayHelloCommand}" />
<Button Content="Load Data" Command="{Binding LoadDataAsyncCommand}" />

消息传递 (WeakReferenceMessenger)

实现松耦合的组件间通信。

// 定义消息类型
public record Message(string Content);

// 发送消息
WeakReferenceMessenger.Default.Send(new Message("Hello!"));

// 接收消息
public partial class ReceiverViewModel : ObservableRecipient
{
    public ReceiverViewModel()
    {
        WeakReferenceMessenger.Default.Register<Message>(this, (r, m) =>
        {
            MessageBox.Show(m.Content);
        });
    }
}

依赖注入 (Ioc)

与 Microsoft.Extensions.DependencyInjection 集成,支持构造函数注入。

// 配置服务
var services = new ServiceCollection();
services.AddSingleton<MyService>();
services.AddTransient<MainViewModel>();

// 解析服务
var provider = services.BuildServiceProvider();
var vm = provider.GetRequiredService<MainViewModel>();

高级特性

数据验证 (ObservableValidator)

集成 INotifyDataErrorInfo,支持声明式验证。

using System.ComponentModel.DataAnnotations;

public partial class LoginViewModel : ObservableValidator
{
    [ObservableProperty]
    [Required(ErrorMessage = "用户名不能为空")]
    private string username;

    [RelayCommand]
    private void Login()
    {
        ValidateAllProperties(); // 触发验证
        if (HasErrors) return;
        // 登录逻辑
    }
}

源生成器

编译时生成代码,提升性能并减少样板代码。

支持的特性:

特性说明
[ObservableProperty] 自动生成属性通知代码
[RelayCommand] 自动生成命令实现
[INotifyPropertyChanged] 自动实现接口

Install-Package CommunityToolkit.Mvvm

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

public partial class MainViewModel : ObservableObject
{
    [ObservableProperty]
    private string inputText;

    [RelayCommand]
    private void Submit() => MessageBox.Show($"输入内容: {InputText}");
}
<StackPanel>
    <TextBox Text="{Binding InputText, UpdateSourceTrigger=PropertyChanged}" />
    <Button Content="提交" Command="{Binding SubmitCommand}" />
</StackPanel>

 

posted @ 2026-09-19 09:36  桃花雪  阅读(27)  评论(0)    收藏  举报