Я использую Prism 2, пытаюсь добавить четыре кнопки навигации (Первая запись, Последняя запись, Предыдущая запись, Следующая запись) в оболочке для использования модулями.Я также хочу, чтобы эти кнопки были отключены, если активный View / ViewModel не предоставляет эти функции.
Я пытался использовать события, но не знал, как достичь своей второй цели в отношении отключения кнопок.Кажется, мне нужно проверить текущий активный View / ViewModel, чтобы увидеть, подписались ли они на событие click во время переключения View.Но я думаю, что издатель не должен знать о подписчике ...
Каким-то образом я попытался по-своему.Я создаю интерфейс IDocNavigation, который имеет четыре метода, соответствующих моим четырем кнопкам.Во время выполнения я проверяю модули ViewModel, реализовали ли они этот интерфейс или нет, и меняю ICommand на лету.Ниже мой код.Я включаю только одну LastRecordCommand:
public ShellViewModel(Views.Shell shell)
{
this.Shell = shell;
shell.DataContext = this;
shell.MainDocking.ActivePaneChanged += (s, e) =>
{
if (e.NewPane.Content is UserControl &&
((UserControl)e.NewPane.Content).DataContext is IDocumentNavigate)
{
IDocumentNavigate vm = ((UserControl)e.NewPane.Content).DataContext as IDocumentNavigate;
LastRecordCommand = new RelayCommand(x => vm.GotoLastRecord(), x => true);
}
else
{
LastRecordCommand = new RelayCommand(x => { }, x => false);
}
};
//...
Я чувствую, что это довольно некрасиво.Создание пустой RelayCommand также глупо.Как я могу улучшить?или как я могу добиться отключения команды, если событие больше подходит в моем случае?