2012-03-23 250 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