Never use `Task.Result` to synchronously wait for an async operation; it can deadlock or freeze the UI.

Instead, change the base class to accept a `Func<Task<bool>>`, then `await` it in `CanExecute()`, raise `CanExecuteChanged` when it finishes (later), then return the async result in the next call to `CanExecute()`.