[.NET/WPF] CommunityToolkit.Mvvm 异步指令

62 篇文章 6 订阅
14 篇文章 2 订阅

我们在开发中, 经常会有这样的需求:

  1. 点击按钮后, 进行一些耗时的工作
  2. 工作进行时, 按钮不可再次被点击
  3. 工作进行时, 会显示进度条, 或者 “加载中” 的动画

RelayCommand

CommunityToolkit.Mvvm 中的 RelayCommand 除了支持最简单的同步方法, 还支持以 Task 作为返回值的异步方法, 当我们为这样的异步方法标记上 RelayCommand 特性时, 它会生成一个对应的异步指令.

  1. 指令在执行时, 主要逻辑会在后台, 而不是运行在 UI 线程中. 具体可以参考 “异步和异步的线程切换”
  2. 指令在执行时, CanExecute 会变为 false, 此时使用该 Command 的 Button 或者其他控件, 也会变成 ‘被禁用’ 的状态.
  3. 如果方法参数中包含一个 CancellationToken, 那么这个任务同样可以被取消. 只需要你方法内部有正确实现 “取消执行” 的逻辑就没问题.

下面是一个例子.

主窗体代码:

<Window x:Class="LearnMvvm.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:LearnMvvm"
        xmlns:vm="clr-namespace:LearnMvvm.ViewModels"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="7![请添加图片描述](https://img-blog.csdnimg.cn/65ddbab8f917458bbfd40ebdb6bb6d16.gif)
00">
    <Window.DataContext>
        <vm:MainViewModel/>
    </Window.DataContext>
    <Grid>
        <StackPanel Margin="50">
            <Button Command="{Binding DoSomethingCommand}">Do something</Button>
            <Button Command="{Binding CancelDoSomethingCommand}" Margin="0 5 0 0">Cancel</Button>

            <ProgressBar Margin="0 10 0 0" Height="15" Value="{Binding Progress}"/>
        </StackPanel>
    </Grid>
</Window>

后台 ViewModel

public partial class MainViewModel : ObservableObject
{
    [ObservableProperty]
    private int progress;

    [RelayCommand]
    public async Task DoSomething(CancellationToken token)
    {
        for (int i = 0; i <= 100; i++)
        {
            if (token.IsCancellationRequested)
                return;

            await Task.Delay(100);
            Progress = i;
        }
    }

    [RelayCommand]
    public void CancelDoSomething()
    {
        DoSomethingCommand.Cancel();
    }
}

效果:
演示
取消执行

在 CommunityToolkit.Mvvm 中, 支持以下样式的 RelayCommand 签名:

  • void 方法名() 无参同步指令
  • void 方法名(类型 参数名) 有参同步指令
  • Task 方法名(), 无参, 不支持取消的异步指令
  • Task 方法名(类型 参数名) 有参, 不支持取消的异步指令
  • Task 方法名(CancellationToken token) 无参, 支持取消的异步指令
  • Task 方法名(类型 参数名, CancellationToken token) 有参, 支持取消的异步指令
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: communitytoolkit.mvvm datagrid 是一种基于MVVM模式的数据表格控件,该控件提供了多种数据绑定的方式,可以快速且简便地展示数据。同时,communitytoolkit.mvvm datagrid 还提供了多种功能,如单元格编辑、分页、排序、筛选等等。这让用户能够方便地处理大量数据。 在使用 communitytoolkit.mvvm datagrid 控件时,需要绑定数据源并提供列的定义,控件会自动将数据填充到表格中。在提供列定义时,可以对不同列的排序方式、列宽、列标题等进行自定义的设置。此外,还可以对每个单元格进行自定义的数据格式化。 与传统的数据表格控件不同的是,communitytoolkit.mvvm datagrid 控件遵循 MVVM 模式的设计,使得数据与 UI 分离,易于维护和扩展。通过将数据、业务逻辑与界面之间的关系明确分离,可以大大提高应用程序的可读性、可扩展性和可维护性。 总的来说,communitytoolkit.mvvm datagrid 是一款功能强大且易于使用的数据表格控件,通过采用 MVVM 模式,可以使数据与 UI 分离,极大地提高应用程序的可读性、可扩展性和可维护性。无论是处理大量数据、展示分页数据、自定义数据格式化等,都是 communitytoolkit.mvvm datagrid 优秀的解决方案。 ### 回答2: CommunityToolkit.Mvvm 是一个帮助开发人员实现 MVVM 模式在 UWP 和 WPF 应用程序中的工具包。这个工具包提供了丰富的控件和类库,使得我们能够更加方便地使用 MVVM 模式来构建应用程序。 其中,DataGrid 控件是 CommunityToolkit.Mvvm 中非常重要的一个控件,它允许我们以表格的形式展示数据,并且支持排序、筛选、列隐藏等基本功能。除此之外,CommunityToolkit.Mvvm 的 DataGrid 还支持分页和自定义单元格样式等高级功能,这些功能都使得我们更加容易构建强大可靠的应用程序。 在使用 CommunityToolkit.Mvvm 的 DataGrid 控件时,我们需要定义一些属性和命令,在 ViewModel 中实现数据的加载、数据的操作等逻辑处理。具体而言,我们需要定义 DataGrid 的 ItemsSource 属性,这个属性绑定到 ViewModel 中的数据集合,然后定义排序、筛选等命令,使得用户点击控件时能够实现相应的逻辑操作。 总之,CommunityToolkit.Mvvm 提供的 DataGrid 控件是一个非常实用的控件,它能够大大简化我们构建 MVVM 应用程序的过程。通过这个控件,我们能够快速轻松地展现数据,同时也能够支持高级功能,使得我们能够更加专注于应用程序的逻辑设计和开发。 ### 回答3: communitytoolkit.mvvm datagrid 是一个开源的工具包,旨在为使用 MVVM 模式的开发人员提供一个易于使用和高度可定制的数据网格。该工具包是由 Microsoft 社区开发的,可以使用 NuGet 包管理器轻松安装和集成到您的应用程序中。 该工具包使用 C# 和 XAML 构建,支持 WPF 和 UWP 平台。它提供了许多有用的功能,如排序、筛选和分页,使用户能够更轻松地浏览和操作数据。此外,它还提供了高度可定制的外观和行为选项,以便开发人员可以使其适应他们的应用程序的视觉设计和用户体验。 与传统的数据网格不同,使用 communitytoolkit.mvvm datagrid 可以使用 MVVM 模式进行数据绑定和操作,将视图逻辑与数据逻辑分离。这使得应用程序更易于维护和扩展,并提高了代码的可重用性和可测试性。此外,它还提供了一个非常灵活的 API,使用户可以轻松地自定义和扩展其功能和行为。 总的来说,communitytoolkit.mvvm datagrid 是一个非常有用的工具包,为开发人员提供了一个高度可定制的数据网格,支持 MVVM 模式,使其更易于使用和维护。如果你正在开发一个需要展示和操作数据的应用程序,那么这个工具包是值得一试的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值