我在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;而不是它的类型会满足)
答案 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>