Prism 不会重新导航到活动视图

Prism do not re-navigate to active view

我在 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();

正确的代码是什么? (要求 "SearchResultsView" 而不是它的类型就可以满足)

最简单的解决方案是像这样在 SearchResultsView 或 ViewModel 中实现 IRegionMemberLifetime:

public class SearchResultsViewModel : BindableBase, IRegionMemberLifetime
{
    // Stuff...

    public bool KeepAlive => false;
}

这将导致 Prism 在导航离开区域时破坏区域内容。


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

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 每次创建一个新实例,否则将显示现有实例。

警告:但这可能会导致内存泄漏,因为如果搜索字符串不匹配,您可能会创建多个视图实例,因此您需要清理他们手动起来。