public interface INavigationAware
{
    bool IsNavigationTarget(NavigationContext navigationContext);
    void OnNavigatedTo(NavigationContext navigationContext);
    void OnNavigatedFrom(NavigationContext navigationContext);
}

当从本页面转到其它页面的时候,会调用OnNavigatedFrom方法,navigationContext会包含目标页面的URI。

当从其它页面导航至本页面的时候,首先会调用IsNavigationTarget,IsNavigationTarget返回一个bool值,简单地说这个方法的作用就是告诉Prism,是重复使用这个视图的实例还是再创建一个。然后调用OnNavigatedTo方法。在导航到本页面的时候,就可以从navigationContext中取出传递过来的参数。

在prism中要实现页面导入时传入参数中比如MyView?param1=abc&param2=123,如何获得这些参数呢?这就要实现INavigationAware接口。

上面那个视图View叫MyView,假设它的ViewModel叫MyViewModel,那个这个ViewModel必须实现INavigationAware接口。

INavigationAware接口源码

public interface INavigationAware
{
bool IsNavigationTarget(NavigationContext navigationContext);
void OnNavigatedTo(NavigationContext navigationContext);
void OnNavigatedFrom(NavigationContext navigationContext);
}

这三个方法都很重要:

  • IsNavigationTarget方法:当前的视图模型是否可以处理请求的导航行为,通常用来指定当前的视图/模型是否可以重用。例如,一个显示客户明细的视图可以显示客户a,客户b....等的信息,他们重用同一个视图。
  • OnNavigatedTo方法:当前的页面被导航到以后发生,这个函数可以用来处理URI的参数。
  • OnNavigatedFrom方法:当前的页面导航到其他页面的时候发生。

这里给出一个实现了INavigationAware接口的ViewModel例子:

[Export("MyViewModel ", typeof(MyViewModel ))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class MyViewModel : INavigationAware
{
private IRegionNavigationJournal navigationJournal; bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext)
{
return true;
} void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
{
// Intentionally not implemented.
} void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
{
var pram1 = navigationContext.Parameters["param1"]; UpdateDataAsync(pram1 ); this.navigationJournal = navigationContext.NavigationService.Journal;
} }

在上面的例子中,OnNavigatedTo方法获取了URI的参数,当参数发生变化自动重新获取数据刷新ViewModel。这个场景可以用在:例如,一个显示客户明细的视图可以显示客户a,客户b....等的信息,他们重用同一个视图。当我们navigate导航到URI:MyView?param1=abc&param2=123的时候,导航到同一个视图但客户ID变化,放在URI的参数中传递,OnNavigatedTo方法获取了URI的参数,重用当前视图,同时刷新数据。整个过程很清晰。

IConfirmNavigationRequest接口

有些时候当我们导航到其他页面的时候,需要弹出一个框提示用户“是否放弃修改?保存、放弃、取消”,这就需要实现IConfirmNavigationRequest接口。还是上面那个例子,那个ViewModel还要实现IConfirmNavigationRequest接口。这样这个ViewModel既实现了INavigationAware接口又实现了IConfirmNavigationRequest接口,触发的顺序如下:

  • 导航发生的时候,如果目标也实现了IConfirmNavigationRequest接口,那么先自动调用ConfirmNavigationRequest.
  • ViewModel触发interaction来打开一个“是否放弃修改?保存、放弃、取消” 确认的UI。
  • 当用户选择了"保存、放弃、取消”以后interaction的callback自动触发
  • 根据用户的选择决定是否继续导航

来一个例子:

ViewModel实现了IConfirmNavigationRequest接口
public class ComposeEmailViewModel : NotificationObject, IConfirmNavigationRequest
{
private readonly InteractionRequest<Confirmation>
confirmExitInteractionRequest;
public ComposeEmailViewModel(IEmailService emailService)
{
this.confirmExitInteractionRequest = new
InteractionRequest<Confirmation>();
}
public IInteractionRequest ConfirmExitInteractionRequest
{
get { return this.confirmExitInteractionRequest; }
}
} XAML定义Interaction <UserControl.Resources>
<DataTemplate x:Name="ConfirmExitDialogTemplate">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"
Text="{Binding}"/>
</DataTemplate>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<ei:Interaction.Triggers>
<prism:InteractionRequestTrigger
SourceObject="{Binding ConfirmExitInteractionRequest}">
<prism:PopupChildWindowAction
ContentTemplate="{StaticResource ConfirmExitDialogTemplate}"/>
</prism:InteractionRequestTrigger>
</ei:Interaction.Triggers>
... 用户确认 void IConfirmNavigationRequest.ConfirmNavigationRequest(
NavigationContext navigationContext, Action<bool> continuationCallback)
{
this.confirmExitInteractionRequest.Raise(
new Confirmation {Content = "...", Title = "..."},
c => {continuationCallback(c.Confirmed);});
}

INavigationAware接口示例的更多相关文章

  1. php中创建和调用webservice接口示例

    php中创建和调用webservice接口示例   这篇文章主要介绍了php中创建和调用webservice接口示例,包括webservice基本知识.webservice服务端例子.webservi ...

  2. php 接口示例

    php 接口示例: public function dev(){ $m=new Model('machine_info'); $ip=$_GET['ip']; echo $ip; //$arr=$m- ...

  3. 微信js-sdk开发获取签名和获取地理位置接口示例

    ###微信js-sdk开发获取签名和获取地理位置接口示例 前言:在做微信公众号开发时需要获取用户的地理位置信息,之前通过高德或者百度.腾讯等地图的api时发现经常获取不到,毕竟第三方的东西,后来改为采 ...

  4. webservice接口示例(spring+xfire+webservice)

      webservice接口示例(spring+xfire+webservice) CreateTime--2018年4月2日17:36:07 Author:Marydon 一.准备工作 1.1 ja ...

  5. 微信JS-SDK分享接口示例中jsapi_ticket.php和access_token.php说明

    关于如何使用微信JS-SDK,可以查看官方介绍说明:查看链接 在使用分享接口的过程中,查看了示例代码,其中包含两个文件jsapi_ticket.php和access_token.php,记录一下这两个 ...

  6. SkylineGlobe TerraExplorer for Web 7.1.0版本 接口示例

    在SkylineGlobe TerraExplorer for Web 7.1.0版本(俗称H5免插件版本)中,如何使用SGWorld接口的三维视域分析方法呢? 请参考下面的示例: 通过下面的代码大家 ...

  7. Spring JDBC RowMapper接口示例

    JdbcTemplate类使用org.springframework.jdbc.core.RowMapper <T>接口在每行的基础上映射ResultSet的行.该接口的实现执行将每行映射 ...

  8. Spring JDBC ResultSetExtractor接口示例

    org.springframework.jdbc.core.ResultSetExtractor接口是JdbcTemplate的查询方法使用的回调接口.此接口的实现执行从ResultSet提取结果的实 ...

  9. Spring JDBC PreparedStatementSetter接口示例

    org.springframework.jdbc.core.PreparedStatementSetter接口充当JdbcTemplate类使用的一般回调接口.该接口在JdbcTemplate类提供的 ...

随机推荐

  1. java中用activiti插件连接mysql数据库,自动建表过程中,在配置mysql架包路径“org.activiti.engine.ActivitiException: couldn't check if tables “

    java中用activiti插件连接mysql数据库,出现错误: org.activiti.engine.ActivitiException: couldn't check if tables are ...

  2. TCP/IP——内网IP

    版权声明:本文系博主原创文章,转载或引用请注明出处. 1)背景 REC 1918留出了3块IP地址空间(1个A类地址段,16个B类地址段,256个C类地址段)作为私有的内部使用的地址. 在这个范围内的 ...

  3. Apache代理技术

    Apache代理技术 apache代理分为正向代理和反向代理. 正向代理是一个位于客户端和原始服务器之间的服务器, 客户端通过代理服务器访问外部的 web, 需要在客户端的浏览器中设置代理服务器. 反 ...

  4. 电脑同时安装了python2和python3后,随意切换版本并使用pip安装

    第一步: python2安装路径下python.exe重命名为python2.exe,python3安装路径下python.exe重命名为python3.exe; 第二步: 分别为python2.ex ...

  5. 【idea】idea 2018.2 for mac永久破解激活方法(亲测2099)

    1. 下载安装idea: 2. 下载激活Jar包 链接:https://pan.baidu.com/s/1NaxYrDNi2eW66epjmk10dg 密码:aec5 3. 在访达中新建/Librar ...

  6. Hadoop-No.5之压缩

    Hadoop存储数据时需要着重考虑的一个因素就是压缩.这里不仅要满足节省存储空间的需求,也要提升数据处理性能.在处理大量数据时,消耗最大的是磁盘和网络的I/O,所以减少需要读取或者写入磁盘的数据量就能 ...

  7. 记一次Python导包经历

    最近由于需要写一个脚本调用另一个文件里面的一个方法,试了很久都导包失败,特此记录一下 问题背景 1)脚本文件为send_reward.py,要调用public_model_func.py里面的一个类方 ...

  8. 逻辑卷----LVM的基础和应用

    逻辑卷管理器 Logical Volume Manager-------逻辑卷宗管理器.逻辑扇区管理器.逻辑磁盘管理器,是Linux核心所提供的逻辑卷管理(Logical volume managem ...

  9. python中的堆和栈

    内存中的堆栈和数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构.内存空间在逻辑上分为三部分:代码区.静态数据区和动态数据区,动态数据区又分为栈区和堆 ...

  10. Vue:选中商品规格改变字体和边框颜色(默认选中第一种规格)

    效果图: CSS: <div class="label"> <p>标签类别</p> <ul> <li v-for=" ...