Не понимаю, зачем вам нужно создавать асин c версию вашего RelayCommand
. Вы можете просто запустить метод asyn c, когда выполняется команда, которая прослушивает токен отмены. Что-то вроде:
Ваша команда: public ICommand DoSomethingCommand { get; set; }
Создайте где-нибудь свою команду: DoSomethingCommand = new RelayCommand(DoSomething);
И пример метода DoSomething
:
private async void DoSomething()
{
using (var cancellationToken = new CancellationTokenSource())
{
await Task.Run(() =>
{
for(i = 0; i < 100; i++)
{
if (cancellationToken.IsCancellationRequested) break;
//Here's where something is done.
}
});
}
}
Привязывайте обычно: <Button Content="Do Something" Command="{Binding DoSomethingCommand}"/>
На всякий случай, если вам это нужно, вот простой RelayCommand
, который вы можете использовать:
public class RelayCommand : ICommand
{
public RelayCommand(Action execute, Func<bool> canExecute)
{
CommandManager.RequerySuggested += (s, e) => CanExecuteChanged(s, e);
CanExecuteDelegate = canExecute;
ExecuteDelegate = execute;
}
public RelayCommand(Action execute) : this(execute, () => true) { }
public event EventHandler CanExecuteChanged = delegate { };
public Func<bool> CanExecuteDelegate { get; set; }
public Action ExecuteDelegate { get; set; }
public bool CanExecute(object parameter) => CanExecuteDelegate();
public void Execute(object parameter) => ExecuteDelegate();
}
Я рекомендую использовать подходящую библиотеку, такую как МВВМ Лайт. Надеюсь, это поможет.