RelayCommand 和 RelayCommand<T>

RelayCommandRelayCommand<T>ICommand 实现,这些实现可向视图公开方法或委托。 这些类型充当在 viewmodel 和 UI 元素之间绑定命令的方法。

平台 API:RelayCommandRelayCommand<T>IRelayCommandIRelayCommand<T>

工作原理

RelayCommandRelayCommand<T> 具有以下主要功能:

  • 它们提供 ICommand 接口的基本实现。
  • 它们还实现 IRelayCommand(和 IRelayCommand<T>)接口,该接口公开 NotifyCanExecuteChanged 方法以引发 CanExecuteChanged 事件。
  • 它们公开采用委托(如 ActionFunc<T>)的构造函数,从而允许包装标准方法和 Lambda 表达式。

使用 ICommand

下面演示如何设置简单的命令:

public class MyViewModel : ObservableObject
{
    public MyViewModel()
    {
        IncrementCounterCommand = new RelayCommand(IncrementCounter);
    }

    private int counter;

    public int Counter
    {
        get => counter;
        private set => SetProperty(ref counter, value);
    }

    public ICommand IncrementCounterCommand { get; }

    private void IncrementCounter() => Counter++;
}

然后,相对 UI 可以是(使用 WinUI XAML):

<Page
    x:Class="MyApp.Views.MyPage"
    xmlns:viewModels="using:MyApp.ViewModels">
    <Page.DataContext>
        <viewModels:MyViewModel x:Name="ViewModel"/>
    </Page.DataContext>

    <StackPanel Spacing="8">
        <TextBlock Text="{x:Bind ViewModel.Counter, Mode=OneWay}"/>
        <Button
            Content="Click me!"
            Command="{x:Bind ViewModel.IncrementCounterCommand}"/>
    </StackPanel>
</Page>

Button 绑定到 viewmodel 中的 ICommand,它包装专用 IncrementCounter 方法。 TextBlock 显示 Counter 属性的值,并在每次属性值更改时更新。

示例

  • 查看示例应用(适用于多个 UI 框架),以了解 MVVM 工具包的实际运行情况。
  • 还可以在单元测试中查找更多示例。