Кнопки Prism Shell, общие для модулей

Я использую 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 тоже глупо. Как я могу улучшить? или как я могу отключить команду, если событие больше подходит в моем случае?


person Lepton    schedule 06.03.2012    source источник


Ответы (1)


Вы можете использовать CompositeCommand в призме.

Определите глобально доступную CompositeCommand

public static readonly CompositeCommand FirstRecord= new CompositeCommand(true);

Затем в вашем модуле модели просмотра

    class Module1
     {


        public DelegateCommand Module1Firstrecord{ get; set; }
        Module1()
        {
          Module1Firstrecord = new DelegateCommand(this.FirstRecord, CanExecute);
        }

        private void FirstRecord()
        {
        //do whatever you want

        }

        private bool CanExecute()
        {
                 return true;
        }

        private void Module1_IsActiveChanged(object sender, EventArgs e)
        {
         //Find if your window is acive
         // if it is active Module1Firstrecord.IsActive = true    
         //else false.
        }
}

С IActiveAware вы можете легко справиться со сценарием активного окна. В зависимости от того, есть ли у вашего активного модуля обработчик команды, кнопки не будут включать / отключать.

person Jimmy    schedule 07.03.2012