CommunityToolkit.Mvvm 库

CommunityToolkit.Mvvm(原名 Microsoft.Toolkit.Mvvm)是一个由 .NET 社区维护的现代化、轻量级 MVVM 框架,专为 WPF、UWP、Xamarin 和 .NET MAUI 等 XAML 平台设计。

一、核心特点

  1. 轻量高效:仅包含必要的 MVVM 组件,无额外依赖

  2. 平台中立:适用于所有 XAML 平台(WPF/UWP/Xamarin/MAUI)

  3. 源码生成:利用 Roslyn 编译器生成高性能代码

  4. 现代化 API:使用 C# 最新特性(如记录类型、模式匹配等)

  5. 官方支持:微软 .NET 团队维护,质量有保障

二、主要组件

1. ObservableObject (替代 INotifyPropertyChanged)

using CommunityToolkit.Mvvm.ComponentModel;

public partial class UserViewModel : ObservableObject
{
    [ObservableProperty]
    private string _name; // 自动生成 public string Name { get; set; }
    
    [ObservableProperty]
    [NotifyPropertyChangedFor(nameof(FullName))] // 当Name变化时通知FullName
    private string _lastName;
    
    public string FullName => $"{Name} {LastName}";
}

2. RelayCommand (ICommand 实现)

using CommunityToolkit.Mvvm.Input;

public partial class UserViewModel
{
    [RelayCommand]
    private void Submit() // 自动生成 SubmitCommand
    {
        // 提交逻辑
    }
    
    [RelayCommand(CanExecute = nameof(CanDelete))]
    private void Delete(User user)
    {
        // 删除逻辑
    }
    
    private bool CanDelete(User user) => user != null;
}

3. 依赖注入支持

using CommunityToolkit.Mvvm.DependencyInjection;

// 配置服务
Ioc.Default.ConfigureServices(
    new ServiceCollection()
        .AddSingleton<IDataService, DataService>()
        .BuildServiceProvider());

// 使用服务
var dataService = Ioc.Default.GetRequiredService<IDataService>();

4. 消息传递

using CommunityToolkit.Mvvm.Messaging;

// 发送消息
WeakReferenceMessenger.Default.Send(new UserLoggedInMessage(user));

// 接收消息
WeakReferenceMessenger.Default.Register<UserLoggedInMessage>(this, (r, m) =>
{
    // 处理消息
});

三、与 Prism/MVVM Light 对比

特性CommunityToolkit.MvvmPrismMVVM Light
大小极轻量 (~100KB)较大中等
学习曲线简单较陡峭中等
依赖注入基础支持强大
导航强大
平台支持全平台主要WPF全平台
源码生成
维护状态活跃活跃维护中

四、实际应用示例

1. 安装

dotnet add package CommunityToolkit.Mvvm

2. 完整 ViewModel 示例

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

public partial class UserViewModel : ObservableObject
{
    private readonly IUserService _userService;
    
    [ObservableProperty]
    private User _selectedUser;
    
    [ObservableProperty]
    private bool _isLoading;
    
    public UserViewModel(IUserService userService)
    {
        _userService = userService;
        LoadUsersCommand.ExecuteAsync(null);
    }
    
    [RelayCommand]
    private async Task LoadUsers()
    {
        IsLoading = true;
        try
        {
            Users = await _userService.GetAllAsync();
            WeakReferenceMessenger.Default.Send(new UsersLoadedMessage(Users.Count));
        }
        finally
        {
            IsLoading = false;
        }
    }
    
    [RelayCommand(CanExecute = nameof(CanDeleteUser))]
    private void DeleteUser(User user)
    {
        _userService.Delete(user.Id);
    }
    
    private bool CanDeleteUser(User user) => user != null && !IsLoading;
}

public record UsersLoadedMessage(int Count);

3. 在 WPF 中使用

<Window x:Class="MyApp.Views.UserView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MyApp.ViewModels"
        Title="用户管理" Height="450" Width="800">
    
    <Window.DataContext>
        <local:UserViewModel/>
    </Window.DataContext>
    
    <Grid>
        <Button Content="加载用户" Command="{Binding LoadUsersCommand}"/>
        <ListView ItemsSource="{Binding Users}" SelectedItem="{Binding SelectedUser}">
            <ListView.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="删除" Command="{Binding DeleteUserCommand}" 
                              CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource AncestorType=ListView}}"/>
                </ContextMenu>
            </ListView.ContextMenu>
        </ListView>
        <ProgressBar IsIndeterminate="True" Visibility="{Binding IsLoading, Converter={StaticResource BooleanToVisibilityConverter}}"/>
    </Grid>
</Window>

五、最佳实践

  1. 使用分部类:将生成的代码与自定义逻辑分离

public partial class UserViewModel
{
    // 自定义逻辑
}

利用源码生成:减少样板代码

[ObservableProperty]
private string _name; // 自动生成属性+通知

弱引用消息:避免内存泄漏

WeakReferenceMessenger.Default.Register<MyMessage>(this, (r, m) => { });

异步命令:正确处理异步操作

[RelayCommand]
private async Task LoadDataAsync()
{
    // 异步操作
}

CommunityToolkit.Mvvm 是现代 .NET MVVM 应用的理想选择,特别适合需要轻量级、高性能且跨平台的场景。它的源码生成特性可以显著减少样板代码,同时保持代码的可读性和可维护性。

<think>好的,用户想了解C#CommunityToolkit.Mvvm的用法和示例。首先,我需要回忆一下这个的基本信息。CommunityToolkit.Mvvm是微软推出的一个轻量级MVVM,可以帮助开发者更方便地实现MVVM模式,减少样板代码。 接下来,用户可能需要知道如何安装这个。根据引用[2],安装说明中提到使用NuGet包管理器,所以应该指导用户通过NuGet安装CommunityToolkit.Mvvm。需要确认正确的包名称和版本,确保与.NET Core兼容。 然后,用户需要具体的用法和示例。这里应该分几个核心功能点来介绍。首先是ObservableObject,用于实现属性通知,这样在属性变化时UI会自动更新。需要展示继承ObservableObject的类,并使用[ObservableProperty]属性标记字段,自动生成属性。 接下来是RelayCommand,处理命令绑定的。需要示例代码展示如何创建命令,并在ViewModel中绑定到按钮的点击事件。说明RelayCommand如何简化ICommand的实现。 然后是Messenger,用于组件间的通信。需要例子说明如何发送和接收消息,比如在不同ViewModel之间传递数据,避免强耦合。 还有Ioc,依赖注入的部分。可能需要提到使用Ioc容器来管理服务注册和获取实例,但CommunityToolkit.Mvvm可能更侧重于ViewModel部分,依赖注入可能需要结合其他,比如Microsoft.Extensions.DependencyInjection,但用户的问题集中在CommunityToolkit本身,所以可能需要简要说明。 需要确保代码示例符合C#语法,并且使用中文注释,方便用户理解。同时,根据用户提供的引用,特别是引用[1]提到MVVM模式的简易使用,要突出该工具包如何简化MVVM实现,减少样板代码。 可能还需要注意用户的开发环境,比如Visual Studio的版本,引用[2]提到Windows版的Visual Studio,所以示例应该在该环境下测试通过。此外,引用[3]提到不同架构模式的比较,可能需要强调MVVM的优势,但用户的问题更关注具体实现,所以可以简要带过。 最后,生成的相关问题要围绕MVVMCommunityToolkit的深入应用,比如如何处理复杂的数据绑定、导航、单元测试等。确保问题对用户有进一步的帮助,引导他们深入学习。</think>以下是对C#CommunityToolkit.Mvvm的详细说明及示例: ### CommunityToolkit.Mvvm核心功能 CommunityToolkit.Mvvm(简称MVVM Toolkit)是微软官方推出的轻量级MVVM模式工具,提供代码生成和类型安全验证功能,可减少样板代码量[^1]。 #### 1. 基础数据绑定 ```csharp // ViewModel类继承ObservableObject public partial class UserViewModel : ObservableObject { // 自动生成可观察属性(需使用partial类) [ObservableProperty] private string _userName = "Guest"; // 自动生成命令 [RelayCommand] private void UpdateName() => UserName = "Admin"; } ``` 此代码通过$[ObservableProperty]$属性自动生成INotifyPropertyChanged实现,避免手动编写属性通知代码[^3]。 #### 2. 命令绑定 ```csharp // 复杂命令示例 [RelayCommand(CanExecute = nameof(CanSubmit))] private void SubmitForm(FormData data) { // 提交逻辑 } private bool CanSubmit(FormData data) => data.IsValid; ``` $RelayCommand$特性自动生成ICommand实现,支持异步操作和参数验证[^1]。 #### 3. 消息传递 ```csharp // 发送消息 Messenger.Send(new UserLoggedInMessage(user)); // 接收消息 [MessengerRegistration] private void OnUserLoggedIn(UserLoggedInMessage message) { // 处理登录事件 } ``` 通过$IMessenger$接口实现松耦合组件通信,支持跨ViewModel交互[^3]。 #### 4. 依赖注入 ```csharp // 注册服务 Ioc.Default.ConfigureServices(services => { services.AddSingleton<IDataService, DataService>(); }); // 获取实例 var service = Ioc.Default.GetService<IDataService>(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值