Я использую Prism 2, пытаясь добавить четыре кнопки навигации (первая запись, последняя запись, предыдущая запись, следующая запись) в оболочке, которая будет использоваться модулями. Я также хочу, чтобы эти кнопки были отключены, если активная функция View/ViewModel не предоставляет эти функции.Кнопки Prism Shell, совместно используемые модулями
Я пробовал использовать события, но не знал, как достичь своей второй цели по отключению кнопок. Кажется, мне нужно проверить текущий активный 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 также глупо. Как я могу улучшить? или как я могу добиться отключение команды, если событие более подходит в моем случае?