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