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 每次创建一个新实例,否则将显示现有实例。
警告:但这可能会导致内存泄漏,因为如果搜索字符串不匹配,您可能会创建多个视图实例,因此您需要清理他们手动起来。
我在 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 每次创建一个新实例,否则将显示现有实例。
警告:但这可能会导致内存泄漏,因为如果搜索字符串不匹配,您可能会创建多个视图实例,因此您需要清理他们手动起来。