RelayCommand and RelayCommand<T>
RelayCommand
, RelayCommand<T>
e ICommand
são implementações que podem expor um método ou delegado à exibição. Esses tipos atuam como uma maneira de associar comandos entre os elementos viewmodel e de interface do usuário.
APIs de Plataforma:
RelayCommand
,RelayCommand<T>
,IRelayCommand
,IRelayCommand<T>
Como eles funcionam
RelayCommand
e RelayCommand<T>
têm os seguintes recursos principais:
- Eles fornecem uma implementação base da interface
ICommand
. - Eles também implementam a interface
IRelayCommand
(eIRelayCommand<T>
), que expõe um métodoNotifyCanExecuteChanged
para gerar o eventoCanExecuteChanged
. - Eles expõem construtores que levam delegados como
Action
eFunc<T>
, que permitem o encapsulamento de métodos padrão e expressões lambda.
Trabalhar com ICommand
O seguinte mostra como configurar um comando simples:
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++;
}
E a interface do usuário relativa poderia ser (usando 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>
O Button
se associa ao ICommand
no viewmodel, que encapsula o método privado IncrementCounter
. O TextBlock
exibe o valor da propriedade Counter
e é atualizado sempre que o valor da propriedade é alterado.
Exemplos
- Confira o aplicativo de exemplo (para várias estruturas de interface do usuário) para ver o Kit de Ferramentas MVVM em ação.
- Você também pode encontrar mais exemplos nos testes de unidade.