2012-03-23 47 views
4

我正在尝试学习Prism Navigation支持。目前,我有一个棱镜区域,我想使用RegionManager.RequestNavigate()来加载视图到该区域。导航确实发生,但是,即使导航目标视图的ViewModel实现了INavigationAware接口,INavigationAware的IsNavigationTarget()也不会被调用。这是我正在使用的代码。棱镜 - 使用RequestNavigate时未调用IsNavigationTarget

外壳:

<StackPanel Margin="10"> 
    <TextBlock Text="Main Window"/> 
    <Button Content="RegionA" Command="{Binding NavigateToACommand}" /> 
    <ContentControl prism:RegionManager.RegionName="MainRegion"/> 
</StackPanel> 

ShellViewModel:

private void NavigateToA() { 
    Uri uri = new Uri("RegionAView", UriKind.Relative); 
    RegionManager.RequestNavigate("MainRegion", uri); 
} 

RegionAView:

<UserControl x:Class="NavigationExample.RegionAView" 
    <Grid> 
     <TextBlock Text="This is Region A"/> 
    </Grid> 
</UserControl> 

RegionAViewModel

public class RegionAViewModel : INavigationAware{ 

    public RegionAViewModel() { 
    } 

    public bool IsNavigationTarget(NavigationContext navigationContext) { 
     return false; //Not Invoked 
    } 

    public void OnNavigatedTo(NavigationContext navigationContext) { 
     //Gets Invoked 
    } 
} 

RegionAView.xaml.cs

[Export("RegionAView")] 
public partial class RegionAView : UserControl { 
    public RegionAView() { 
     InitializeComponent(); 
    } 
} 

为什么IsNavigationTarget()没有得到调用之前导航的完成?

回答

2

我认为你的问题是你把你的视图导出为单例。修改VM和V如下:

[Export("RegionAView")] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public partial class RegionAView : UserControl 
{  
public RegionAView() 
{   
InitializeComponent();  
} 
} 

基本上,当你有存在的实例IsNavigationTarget将被调用。但它不适用于新创建的实例。

+1

katit,我想你是对的。如果已经存在一个视图实例,则会调用IsNavigationTarget()。第一次,OnNavigatedTo()被直接调用,而不需要调用IsNavigationTargert()。那么,如果我们想要,第一次如何取消导航?非常感谢。 – Jatin 2012-03-23 06:33:50