AsyncCommand в .NET MAUI
я не могу найти
AsyncCommand
в .NET MAUI или .NET MAUI Community Toolkit. Любая идея, какой пакет/пространство имен я могу найти?
4 ответа
Набор инструментов .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;}