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>

浙公网安备 33010602011771号