Wasyster
Wasyster

Reputation: 2535

Community Toolkit equivalent of ICommnad ChangeCanExecute

I can't find how to use IAsyncRelayCommond agains ICommnad.

Here is my view model:

[ObservableObject]
public partial class MotorcycleListViewModel(IMotorcycleService motorcycleService)
{
    #region life cycle commands
    public IAsyncRelayCommand AppearingCommand => new AsyncRelayCommand(OnAppearingAsync);
    public IAsyncRelayCommand DisappearingCommand => new AsyncRelayCommand(OnDisappearingAsync);
    #endregion

    #region paging commands
    public ICommand PreviousPageCommand { get; private set; }
    public ICommand NextPageCommand { get; private set; }
    #endregion

    [ObservableProperty]
    private ObservableCollection<MotorcycleModel> motorcycles;

    private int page = 1;
    private bool isLoading = false;
    private bool hasNextPage = true;

    private async Task OnAppearingAsync()
    {
        PreviousPageCommand = new Command(async () => await OnPreviousPageAsync(), () => page > 1 && !isLoading);
        NextPageCommand = new Command(async () => await OnNextPageAsync(), () => !isLoading && hasNextPage);

        await LoadMotorcycles();
    }

    private async Task OnDisappearingAsync()
    { }

    private async Task OnPreviousPageAsync()
    {
        if (isLoading) return;

        page = page <= 1 ? 1 : --page;
        await LoadMotorcycles();
    }

    private async Task OnNextPageAsync()
    {
        if (isLoading) return;

        page++;
        await LoadMotorcycles();
    }

    private async Task LoadMotorcycles()
    {
        isLoading = true;

        var result = await motorcycleService.GetPagedAsync(page);

        if (result.IsError)
        {
            await Application.Current.MainPage.DisplayAlert("Error", "Motorcycles not loaded!", "OK");
            return;
        }

        hasNextPage = !(result.Value.Count < 2);

        Motorcycles = new ObservableCollection<MotorcycleModel>(result.Value);

        isLoading = false;

        ((Command)PreviousPageCommand).ChangeCanExecute();
        ((Command)NextPageCommand).ChangeCanExecute();
    }
}

What I am interested in, how can I replace NextPageCommand and PreviousPageCommand to be IAsyncRelayCommands and to be able to do the same as the following two lines:

((Command)PreviousPageCommand).ChangeCanExecute();
((Command)NextPageCommand).ChangeCanExecute();

thnx

Upvotes: 0

Views: 70

Answers (1)

Guangyu Bai - MSFT
Guangyu Bai - MSFT

Reputation: 4586

IAsyncRelayCommand does not have a ChangeCanExecute method, but it has a similar method called NotifyCanExecuteChanged. This method is used to notify the UI that the execution status of the command has changed.

Here's an example using IAsyncRelayCommand:

public class MyViewModel
{
    public IAsyncRelayCommand LoadDataCommand { get; }

    public MyViewModel()
    {
        LoadDataCommand = new AsyncRelayCommand(LoadDataAsync, CanLoadData);
    }

    public void UpdateCommandState()
    {
        LoadDataCommand.NotifyCanExecuteChanged();
    }
}

In this example, whenever the conditions for executing LoadDataCommand change, you can call UpdateCommandState to ensure the UI stays in sync.

Here is the more information about the RelayCommand.NotifyCanExecuteChanged.Method.

Upvotes: 0

Related Questions