2012-03-06 4 views
0

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

ответ

0

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

Смежные вопросы