棱镜不能重新导航到活动视图
本文关键字:活动 视图 导航 不能 新导航 棱镜 | 更新日期: 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,因为如果搜索字符串不匹配,您可能会创建许多视图实例,因此您需要手动清理它们。