Кнопки оболочки Prism, совместно используемые модулями - PullRequest
0 голосов
/ 06 марта 2012

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

1 Ответ

0 голосов
/ 07 марта 2012

Вы можете использовать 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 вы можете легко обрабатывать сценарий активного окна. В зависимости от того, есть ли на вашем активном модуле обработчик для команды, кнопки не включаются / выключаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...