2013-08-23 37 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”集合包含在该区域中可见/活动的所有视图。 Prism提供了一个'AllActiveRegion'和一个'SingleActiveRegion'。 'AllActiveRegion'可以包含多个活动视图和'SingleActiveRegion'只有一个。 – Jehof

+0

是的,但我在我的shell中有一个tabcontrol,我想从当前正在使用的选项卡查看。是否有可能使用regionmanager从tabcontrol中获取项目? –

回答

1

它取决于你想要执行你的代码的目的地。

如果你在一个视图模型中,你可以把视图模型上的接口IActiveAware。它为您提供属性IsActive和事件IsActiveChanged。

如果您在视图模型外部,则可以使用RegionManager。在每个区域都是Views和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)); 
} 
相关问题