Я спрашиваю, почему не стоит заходить в эту библиотеку для логики графического интерфейса. Вы не хотите включать кнопки, которые ничего не будут делать, поэтому команды, которые отключены, когда они фактически не могут работать, могут быть полезны.
При использовании шаблона MVVM мои ViewModels обычно предоставляют ICommands напрямую. Если вы используете Prism, существует реализация DelegateCommand, которая позволяет легко реализовать эти команды в ваших ViewModels. Если нет, или если CanExecute может измениться, я бы реализовал ICommand в отдельном классе.
Если у вас длительная / дорогостоящая операция, вы всегда можете кэшировать результат вызова библиотеки. Я предполагаю, что вы получите событие или обратный вызов, если состояние изменится, что позволит включить / отключить команду. В этом случае в вашей реализации ICommand вы бы вызвали событие CanExecuteChanged, чтобы графический интерфейс отражал изменения в команде. Вот пример команды, которая использует службу поддержки, которая знает, когда операция может быть завершена:
public class ExpensiveCommand : ICommand
{
private readonly IExpensiveService service;
private bool canExecute;
public ExpensiveCommand (IExpensiveService service)
{
this.service = service;
canExecute = service.CanExecute();
service.CanExecuteChanged += OnCanExecuteChanged;
}
public void Execute(object parameter)
{
service.Execute();
}
public bool CanExecute(object parameter)
{
return canExecute;
}
public event EventHandler CanExecuteChanged;
private void OnCanExecuteChanged(object sender, EventArgs e)
{
canExecute = service.CanExecute();
if (CanExecuteChanged != null)
CanExecuteChanged(this, EventArgs.Empty);
}
}
С другой стороны, если вы всегда хотите, чтобы команда была исполняемой, вы можете просто вернуть true из метода CanExecute.