Поделиться через


RelayCommand и RelayCommand<T>

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

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

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

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

  • Они предоставляют базовую реализацию ICommand интерфейса.
  • Они также реализуют IRelayCommand интерфейс (и IRelayCommand<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 объекту viewmodel, который упаковывает закрытый IncrementCounter метод. Отображает TextBlock значение Counter свойства и обновляется при каждом изменении значения свойства.

Примеры

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