是否可以检查区域内正在使用哪个视图?

时间:2013-08-23 07:53:29

标签: wpf mvvm view prism

是否可以检查区域内正在使用哪个视图? 我正在使用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) ...

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这取决于您要执行代码的目标位置。

如果您在视图模型中,则可以在视图模型上放置 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));
}