RelayCommand и RelayCommand<T>

RelayCommand и RelayCommand<T> — это реализации ICommand, которые могут открывать для представления метод или делегат. Эти типы действуют как способ привязки команд между элементами viewmodel и пользовательского интерфейса.

API платформы:RelayCommand, RelayCommand<T>, IRelayCommandIRelayCommand<T>

Принцип работы

RelayCommand и RelayCommand<T> имеют следующие основные функции:

  • Они предоставляют базовую реализацию ICommand интерфейса.
  • Они также реализуют интерфейс IRelayCommandIRelayCommand<T>), который предоставляет метод NotifyCanExecuteChanged для вызова события CanExecuteChanged.
  • Они предоставляют конструкторы, принимающие делегаты, как Action и Func<T>, которые позволяют упаковать стандартные методы и лямбда-выражения.

Работа с 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++;
}

И соответствующий интерфейс пользователя может выглядеть так (с использованием 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 привязывается к ICommand в модели представления, которая инкапсулирует приватный метод IncrementCounter. TextBlock отображает значение свойства Counter и обновляется каждый раз, когда значение свойства изменяется.

Примеры

  • Ознакомьтесь с примером приложения (для нескольких платформ пользовательского интерфейса), чтобы просмотреть набор средств MVVM в действии.
  • Дополнительные примеры можно найти в модульных тестах.