zoukankan      html  css  js  c++  java
  • INavigationAware接口示例

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

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

    INavigationAware接口源码

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

    这三个方法都很重要:

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

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

    View Code
    1 [Export("MyViewModel ", typeof(MyViewModel ))]
     2 [PartCreationPolicy(CreationPolicy.NonShared)]
     3  public class MyViewModel : INavigationAware
     4 {
     5     private IRegionNavigationJournal navigationJournal;
     6 
     7     bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext)
     8     {
     9        return true;
    10      }
    11 
    12     void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext)
    13     {
    14             // Intentionally not implemented.
    15       }
    16 
    17 
    18      void INavigationAware.OnNavigatedTo(NavigationContext navigationContext)
    19      {
    20           var pram1 = navigationContext.Parameters["param1"];
    21          
    22           UpdateDataAsync(pram1 );
    23             
    24           this.navigationJournal = navigationContext.NavigationService.Journal;
    25         }
    26 
    27 
    28 
    29 }

    在上面的例子中,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自动触发
    • 根据用户的选择决定是否继续导航

    来一个例子:

    View Code
    ViewModel实现了IConfirmNavigationRequest接口
    
    1 public class ComposeEmailViewModel : NotificationObject, IConfirmNavigationRequest
    2 {
    3 private readonly InteractionRequest<Confirmation>
    4 confirmExitInteractionRequest;
    5 public ComposeEmailViewModel(IEmailService emailService)
    6 {
    7 this.confirmExitInteractionRequest = new
    8 InteractionRequest<Confirmation>();
    9 }
    10 public IInteractionRequest ConfirmExitInteractionRequest
    11 {
    12 get { return this.confirmExitInteractionRequest; }
    13 }
    14 }
    
    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);});
    }
    
     
  • 相关阅读:
    合同主体列表添加两条合同主体,返回合并支付页面,支付总弹"请选择合同主体",删除后,竟然还能支付(改合并支付页面的字段状态)
    (TODO:)下载图片,报错:warning: could not load any Objective-C class information from the dyld shared cache. This will significantly reduce the quality of type information available.
    GCD死锁 多线程
    iOS知识总结
    快速排序,冒泡排序,选择排序
    fight
    3D Touch
    Xcode 调试技巧
    右滑退出手势及隐藏导航栏存在的风险
    C语言-第5课
  • 原文地址:https://www.cnblogs.com/sunrfun/p/2979702.html
Copyright © 2011-2022 走看看