AsyncCommand в .NET MAUI

я не могу найти AsyncCommandв .NET MAUI или .NET MAUI Community Toolkit. Любая идея, какой пакет/пространство имен я могу найти?

4 ответа

https://devblogs.microsoft.com/dotnet/introduction-the-net-maui-community-toolkit-preview/#what-to-expect-in-net-maui-toolkit

Набор инструментов .NET MAUI не будет содержать функции MVVM из набора инструментов сообщества Xamarin, такие как AsyncCommand. В будущем мы добавим все функции, относящиеся к MVVM, в новый пакет NuGet,CommunityToolkit.MVVM.

установить CommunityToolkitMVVM 8.0.0

      [RelayCommand]
async Task your_method (){...}

Добавьте пакет Nuget AsyncAwaitBestPractices.MVVM в свой проект, чтобы вернуть AsyncCommand.

Для получения дополнительной информации см. страницу проекта Github: https://github.com/brminnick/AsyncAwaitBestPractices .

Даже если оно было помечено как решенное, кому-то может быть полезно это решение, которое очень хорошо написал Джон Тириет. Я подразумевал это, и это сработало нормально. https://johnthiriet.com/mvvm-going-async-with-async-command/

      public interface IAsyncCommand<T> : ICommand
{
    Task ExecuteAsync(T parameter);
    bool CanExecute(T parameter);
}

public class AsyncCommand<T> : IAsyncCommand<T>
{
    public event EventHandler CanExecuteChanged;

    private bool _isExecuting;
    private readonly Func<T, Task> _execute;
    private readonly Func<T, bool> _canExecute;
    private readonly IErrorHandler _errorHandler;

    public AsyncCommand(Func<T, Task> execute, Func<T, bool> canExecute = null, IErrorHandler errorHandler = null)
    {
        _execute = execute;
        _canExecute = canExecute;
        _errorHandler = errorHandler;
    }

    public bool CanExecute(T parameter)
    {
        return !_isExecuting && (_canExecute?.Invoke(parameter) ?? true);
    }

    public async Task ExecuteAsync(T parameter)
    {
        if (CanExecute(parameter))
        {
            try
            {
                _isExecuting = true;
                await _execute(parameter);
            }
            finally
            {
                _isExecuting = false;
            }
        }

        RaiseCanExecuteChanged();
    }

    public void RaiseCanExecuteChanged()
    {
        CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    }

//#region Explicit implementations
    bool ICommand.CanExecute(object parameter)
    {
        return CanExecute((T)parameter);
    }

    void ICommand.Execute(object parameter)
    {
        ExecuteAsync((T)parameter).FireAndForgetSafeAsync(_errorHandler);
    }
//#endregion
}

Затем его можно использовать в MAUI так же, как в Xamarin.

      public MyMVVM()
{
   MyCommand = new AsyncCommand(async()=> await MyMethod);
}
...
public AsynCommand MyCommand {get;}