2016-12-22 4 views
0

У меня есть эта оболочка интерфейса:
enter image description hereПризма. EventAggregator в настоящее время активная вкладка

На кнопку обновления, я называю _eventAggregator.GetEvent<RefreshEvent>().Publish();

и код во всех регионах в закладках подписались на это событие.

Задача: Проблема в том, что я хочу обновлять только текущую активную вкладку. Но в моем случае все вкладки обновляются. Есть ли хорошая практика для решения этой проблемы?

Edit 1
я реализую IActiveAware на мой взгляд:

public partial class ShipsControlView : UserControl, IActiveAware 
{ 
    public ShipsControlView() 
    { 
     InitializeComponent(); 
    } 

    private bool isActive; 

    public bool IsActive 
    { 
     get 
     { 
      return this.isActive; 
     } 
     set 
     { 
      if (this.isActive == value) 
       return; 

      this.isActive = value; 

      var viewModelActiveAware = this.DataContext as IActiveAware; 
      if (viewModelActiveAware != null) 
       viewModelActiveAware.IsActive = value; 

      this.OnIsActiveChanged(); 
     } 
    } 

    public event EventHandler IsActiveChanged; 

    protected virtual void OnIsActiveChanged() 
    { 
     var handler = this.IsActiveChanged; 
     if (handler != null) 
      handler(this, EventArgs.Empty); 
    } 
} 

Добавлено этот вид на TabControl:

<TabControl 
     prism:RegionManager.RegionName="TabRegion2" 
     ItemContainerStyle="{StaticResource HeaderStyle}" 
     ></TabControl> 

.

regionManager.RegisterViewWithRegion("TabRegion2", typeof(ShipsControlView)); 

проверить статус IsActive, она всегда меняется, если я нажимаю вкладки (работает справа).

Проблема: Если вкладка не активна, команды на этой вкладке запускаются на моей глобальной составной кнопке, но это не должно.

+1

Хороший подход должен были бы передать значение наряду с событием, т.е. строкового значения (которое может содержать, например, название вкладки, чтобы быть активным), а затем он может быть проверен в обратном вызове абонента, нужно ли обновлять код на определенной вкладке. –

ответ

1

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

Вот Документы: http://prismlibrary.readthedocs.io/en/latest/WPF/09-Communication/#solution-commanding

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