Condividi tramite


RelayCommand e RelayCommand<T>

e RelayCommand RelayCommand<T> sono ICommand implementazioni che possono esporre un metodo o un delegato alla visualizzazione. Questi tipi fungono da modo per associare i comandi tra il modello di visualizzazione e gli elementi dell'interfaccia utente.

API della piattaforma: RelayCommand, RelayCommand<T>, IRelayCommand, IRelayCommand<T>

Come funzionano

RelayCommand e RelayCommand<T> hanno le funzionalità principali seguenti:

  • Forniscono un'implementazione di base dell'interfaccia ICommand .
  • Implementano anche l'interfaccia IRelayCommand (e IRelayCommand<T>) che espone un NotifyCanExecuteChanged metodo per generare l'evento CanExecuteChanged .
  • Espongono costruttori che accettano delegati come Action e Func<T>, che consentono il wrapping di metodi standard ed espressioni lambda.

Uso di ICommand

Di seguito viene illustrato come configurare un comando semplice:

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 l'interfaccia utente relativa potrebbe quindi essere (usando XAML WinUI):

<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>

L'oggetto Button viene associato all'oggetto ICommand nel modello di visualizzazione, che esegue il wrapping del metodo privato IncrementCounter . TextBlock Visualizza il valore della Counter proprietà e viene aggiornato ogni volta che il valore della proprietà cambia.

Esempi