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);});
}

 

 

posted @ 2013-03-24 21:29  sunrfun  阅读(1430)  评论(0编辑  收藏  举报