Мое приложение может иметь несколько дизайнерских окон. Каждое окно состоит из нескольких пользовательских элементов управления, которые динамически взаимодействуют с помощью RelayCommands. Я создал следующий класс в качестве основы для командной инфраструктуры.
public static class Commands
{
public static readonly RoutedCommand EntityEditRequest = new RoutedCommand();
public static RelayCommand EntityEditorChangeRequest;
public static RelayCommand XMLUpdateRequest;
public static RelayCommand SaveRequest;
}
Каждая модель представления для пользовательских элементов управления будет делать что-то подобное в конструкторе
public XMLEditorViewModel()
{
Commands.Commands.SaveRequest = new RelayCommand(Save_Executed);
Commands.Commands.XMLUpdateRequest = new RelayCommand(UpdateXML);
}
Однако я полностью упустил момент, что приложение может иметь несколько окон. Когда каждое окно открывается, статические команды устанавливаются для этого конкретного окна.
Пример:
Открыто окно A - конструкторы для пользовательских контроллеров устанавливают RelayCommands, и все в порядке.
Открыто окно B - конструкторы для пользовательских контроллеров устанавливают RelayCommands. Привязка команды окна A потеряна!
Поэтому, когда я меняю вкладку на Окно A (окна с вкладками), никакие команды не работают.
Мне нужна идея, чтобы при смене вкладки активное окно всегда задавало команды. Я могу попытаться поместить командование в событие tab_selection_changed, но мне как-то плохо. Есть ли правильный способ сделать это? Любая помощь очень ценится.
Edit:
Вопрос оказался немного запутанным среди читателей. Я не пытаюсь сделать несколько подписчиков на команду. В любой данный момент активным является только одно окно. Это окно состоит из нескольких пользовательских элементов управления, некоторые из которых загружаются динамически с помощью команд; но каждая команда обрабатывается одним классом модели представления, поэтому нет нескольких подписчиков. Моя проблема в том, что приложение может загружать несколько окон во вкладках - только одно окно активно в любой заданной точке, но пользователь может перейти на другую вкладку и сделать другое окно активным. Поскольку конструктор модели представления назначает статические RelayCommands, при загрузке каждого нового окна статическая команда устанавливается на новую привязку.
Окно. Открытое окно. Конструктор модели представления устанавливает привязку статической команды к своему обработчику команд объекта. Окно А активно. Командование в порядке.
Окно B - конструктор модели представления загруженного окна B устанавливает статическую привязку команды к своему обработчику команд объекта. Окно B активно. Командование в порядке.
Теперь пользователь выбирает вкладку Окно А, чтобы установить Окно А как активное. Командование не будет работать. Конечно, это не так, поскольку команда привязана к обработчику команд окна B.
Теоретически статические команды могут обрабатывать сценарий, поскольку в любой заданной точке будет только одно активное окно. Но как ??