视图和视图模型参与导航
通常应用程序中的视图和视图模型会希望参与导航,而Prism中的INavigationAware接口可以实现这一点。您可以在视图或视图模型(更普遍)上实现此接口。通过实现此接口,您的视图或视图模型可以选择参与导航的过程。
注意: 在接下来的描述中,尽管是在视图导航期间引用了对该接口的调用,但应该注意的是无论INavigationAware接口是由视图实现还是由视图模型实现,它都会在导航期间被调用。 在导航期间,Prism会检查视图是否实现了INavigationAware接口;如果有,它会在导航过程中调用必要的方法。Prism还会检查视图的DataContext对象是否也实现了此接口;如果有,它也会在导航过程中调用必要的方法。
该接口允许视图或视图模型参与导航操作。INavigationAware接口中定义了三个方法。
public interface INavigationAware
{
bool IsNavigationTarget(NavigationContext navigationContext);
void OnNavigatedTo(NavigationContext navigationContext);
void OnNavigatedFrom(NavigationContext navigationContext);
}
IsNavigationTarget方法允许现有的(显示的)视图或视图模型表明它是否能够处理导航请求。当您可以重用已存在的视图来处理导航操作,或者导航到已存在的视图时,这会很有用。例如可以更新显示客户信息的视图以显示不同客户的信息。有关使用此方法的更多信息,请参阅导航到现有视图。
OnNavigatedFrom和OnNavigatedTo方法会在导航运转期间被调用。如果该区域中的当前活动视图(或其视图模型)实现了此接口,则会在导航发生之前调用其 OnNavigatedFrom方法。OnNavigatedFrom方法允许先前的视图保存状态或准备停用或从UI中删除,例如保存用户对Web服务或数据库所做的任何更改。
如果新创建的视图(或其视图模型)实现了此接口,则会在导航完成后调用其中的OnNavigatedTo方法。OnNavigatedTo方法允许新显示的视图初始化自身,并可以使用在导航URI上传递给它的任何参数。有关传递参数的更多信息,请参阅导航期间传递参数。
在新视图被实例化、初始化并添加到目标区域之后,它就变成了活动视图,而前一个视图则会被停用。有时您会希望从区域中删除停用的视图。因此Prism提供了IRegionMemberLifetime接口,通过允许您指定停用的视图是从区域中删除还是简单地标记为停用,从而使您可以控制区域内视图的生命周期。
public class EmployeeDetailsViewModel : IRegionMemberLifetime
{
public bool KeepAlive
{
get { return true; }
}
}
IRegionMemberLifetime接口定义了一个只读属性KeepAlive。如果此属性返回false,则视图在停用时会从区域中删除。因为该区域不再具有对该视图的引用,所以它可以被垃圾回收(除非您的应用程序中的某些其他组件维持了对它的引用)。您可以在视图或视图模型上实现此接口。尽管IRegionMemberLifetime接口的主要目的是让您在激活和停用期间管理区域内视图的生命周期,但在目标区域激活新视图后的导航过程中也会考虑KeepAlive属性。
注意: 可以显示多个视图的区域将同时显示非活动视图和活动视图,例如使用ItemsControl或TabControl的区域。从这些类型的区域中移除非活动视图将导致该视图从UI中移除。