棱镜不会重新导航到活动视图

时间:2016-10-10 06:55:37

标签: c# wpf mvvm navigation prism

我在WPF应用程序中使用prism。 我想导航到" SearchResultsView"属性更改但仅当视图不是活动视图时

这是我的代码:

public string SearchString
{
    get { return _searchString; }
    set
    {
        if (_searchString != value)
        {
            _searchString = value;

            _regionManager.RequestNavigate(RegionNames.ContentRegion, "SearchResultsView");

            OnPropertyChanged();
        }
    }
}

导航第一次发生时就可以了。 但是每次更改searchString时,它仍然会重新导航到同一个活动视图。

我在模块Init()中注册视图,如下所示:

_container.RegisterTypeForNavigation<SearchResultsView>();

因为我使用MVVM,所以我无法在导航之前检查活动视图,如下所示:

var activeView = _regionManager.Regions[RegionNames.ContentRegion].ActiveViews.FirstOrDefault();

这样做的正确代码是什么? (要求&#34; SearchResultsView&#34;而不是它的类型会满足)

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是在SearchResultsView或ViewModel中实现IRegionMemberLifetime,如下所示:

public string SearchString
{
    get { return _searchString; }
    set
    {
        if (_searchString != value)
        {
            _searchString = value;

            var navigationParams = new NavigationParameters {{ "searchString", _searchString }};
            _regionManager.RequestNavigate(RegionNames.ContentRegion, "SearchResultsView", navigationParams);

            OnPropertyChanged();
        }
    }
}

// --------------------------------------------------------------------

public class SearchResultsViewModel : BindableBase, INavigationAware
{
    private string _searchString;

    public void OnNavigatedTo(NavigationContext navigationContext)
    {
        _searchString = navigationContext.Parameters["searchString"] as string;
    }

    public bool IsNavigationTarget(NavigationContext navigationContext)
    {
        var searchString = navigationContext.Parameters["searchString"] as string;
        return _searchString.Equals(searchString);
    }

    public void OnNavigatedFrom(NavigationContext navigationContext)
    {
        // Ignored
    }
}

如果导航离开,这将导致Prism破坏区域内容。

否则,您可以实现INavigationAware来检查搜索字符串是否不同:

{{1}}

如果搜索字符串不同,这将告诉Prism每次创建一个新实例,否则它将显示现有实例。

警告:但这可能导致MemoryLeak,因为如果搜索字符串不匹配,您可能会创建许多视图实例,因此您需要手动清理它们。 / p>