2013-08-23 3 views
0

Можно ли проверить, какой вид используется внутри региона? Я использую MVVM.Можно ли проверить, какой вид используется внутри региона?

Я получил этот код на данный момент:

Application.Current.Dispatcher.InvokeAsync(() => 
     { 
      var countactiveviews = RegionManager.Regions.First(x => x.Name == "MainRegion").ActiveViews; 

      if (!countactiveviews.Any()) 
      { 
       //// Show preview 
       var modulePreview = new Uri(_view.Replace("GridView", "Preview"), UriKind.Relative); 
       RegionManager.RequestNavigate(Regions.PropertiesRegion, modulePreview);   
      } 

      else 
      { 

      } 

Когда _view используется или открытый в данный момент, то я хочу, чтобы выполнить этот код еще раз.

Так в моем другом:

if(_view is being viewed) ... 

Любые идеи?

+0

что вы подразумеваете под "б"? Коллекция 'ActiveViews' содержит все виды, видимые/активные в регионе. Призма предоставляет «AllActiveRegion» и «SingleActiveRegion». 'AllActiveRegion' может содержать несколько активных видов и' SingleActiveRegion' только один. – Jehof

+0

Да, но у меня есть tabcontrol в моей оболочке, и мне нужен вид из вкладки, которая в настоящее время используется. Можно ли получать элементы из tabcontrol с помощью regionmanager? –

ответ

1

Это зависит от того места, где вы хотите выполнить свой код.

Если вы находитесь в модели просмотра, вы можете установить интерфейс IActiveAware на ваш взгляд. Он предоставляет вам свойство IsActive и событие IsActiveChanged.

Если вы находитесь за пределами модели для просмотра, вы можете использовать RegionManager. В каждом регионе представлены виды и коллекция ActiveViews. Вы можете проверить ActiveViews для просмотра модели. Также вы можете использовать интерфейс INotifyCollectionChanged для обнаружения измененной коллекции активного просмотра. Следующим, что может вам помочь, является интерфейс InavigationAware. Поместите его на свою модель просмотра. Существует метод bool IsNavigationTarget (NavigationContext ...), который поможет вам определить ваш взгляд. Также позвольте использовать метод OnNavigatedFrom для хранения параметров NavigationContext, а затем использовать его в методе IsNavigationTarget.

Вот пример:

class MyViewModel : INavigationAware 
{ 
    NavigationContext navigationContext; 

    void OnNavigatedFrom(NavigationContext navigationContext) 
    { 
     this.navigationContext = navigationContext; 
    } 

    bool IsNavigationTarget(NavigationContext navigationContext) 
    { 
     return Equals(this.navigationContext.Uri, navigationContext.Uri); 
    } 

    void OnNavigateTo(NavigationContext navigationContext) 
    { 
    } 
} 

... 
// somewhere where you need execute 

INotifyCollectionChanged activeViews = RegionManager.Regions["MainRegion"].ActiveViews as INotifyCollectionChanged; 
if (activeViews!=null) 
{ 
    activeViews.CollectionChanged += ActiveViews_CollectionChanged; 
} 


... 
Uri modulePreview; 

void ActiveViews_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    IViewsCollection activeViews = (IViewsCollection)sender; 
    NavigationContext navigationContext=new NavigationContext(null, modulePreview); 
    activeViews.Any(x=> ((INavigationAware)x).IsNavigationTarget(navigationContext)); 
} 
Смежные вопросы