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

本文关键字:活动 视图 导航 不能 新导航 棱镜 | 更新日期: 2023-09-27 18:12:32

我使用prism与WPF应用程序。我想导航到"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,如果搜索字符串不同,则每次创建一个新实例,否则将显示现有的实例。

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