Как сгруппировать ICommands, чтобы, если один выполняется, другие не могли?

2

Если я связываю ICommand с элементом управления в WPF, он включается/отключается в зависимости от состояния команды CanExecute. Мне известно, что отключение выполнения нескольких команд может быть выполнено с использованием одного логического поля во всех реализациях CanExcecute ICommand, который я хочу "сгруппировать". У меня вопрос, должен ли я сделать это так или сделать это в XAML каким-то образом? Есть ли "стандартный" способ сделать это? Любой класс .NET для управления этим?

  • 0
    Для этого нет встроенного класса в .NET. Проверьте эту статью, она объясняет объединение команд в контейнер. Вам, вероятно, понадобится что-то подобное
  • 0
    Вы можете расширить свою собственную реализацию ICommand настолько, насколько вам нужно. Например, вы можете автоматизировать отключение нескольких команд, получая ссылки на все из них и увеличивая значение CanExecuteChanged для каждой из них.
Показать ещё 2 комментария
Теги:
wpf
mvvm

1 ответ

1

В .NET Framework такого класса нет, но вы можете посмотреть, как класс CompositeCommand реализован в Prism.

Из документов:

Он поддерживает список дочерних команд (экземпляры DelegateCommand). Метод Execute класса CompositeCommand просто вызывает метод Execute для каждой из дочерних команд по очереди. Метод CanExecute аналогичным образом вызывает метод CanExecute каждой дочерней команды, но если ни одна из дочерних команд не может быть выполнена, метод CanExecute вернет false. Другими словами, по умолчанию CompositeCommand может выполняться только тогда, когда могут быть выполнены все дочерние команды.

Вы связываете дочерние команды, используя метод RegisterCommand класса CompositeCommand:

public DelegateCommand UpdateCommand { get; private set; }

public ViewModel()
{
    UpdateCommand = new DelegateCommand(Update);
    ApplicationCommands.SaveCommand.RegisterCommand(UpdateCommand);
}
  • 0
    Это не совсем то, что мне нужно. Мне нужно эксклюзивное выполнение одной команды из «группы». Поэтому мне нужно установить ^ может выполнять ^ для всех остальных команд в ложь и поднять их CanExecuteChanged. Тогда мне придется снова разрешить казнь. Кажется, что простой булевский флаг - путь сюда. Попытка решить это каким-то более приятным способом, но это только создает больше проблем.
  • 0
    Так в чем же тогда твоя проблема? Не существует «стандартного» способа сделать это.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню