2011-05-28 61 views
2

我正在嘗試使用Prism 4創建Silverlight應用程序,並且正在測試它的導航功能。當我點擊一個按鈕時,我想在兩個視圖之間切換。第一種觀點是:Prism:IRegionMemberLifetime在某些情況下不起作用

public partial class HomeView 
{ 
    public HomeView(HomeViewModel viewModel) 
    { 
     DataContext = viewModel; 

     InitializeComponent(); 
    } 
} 

和視圖模型:

public class HomeViewModel : NotificationObject, IRegionMemberLifetime 
{ 
    private readonly IRegionManager _regionManager; 

    public DelegateCommand SubmitCommand { get; set; } 
    public bool KeepAlive { get { return false; } } 

    public HomeViewModel(IRegionManager regionManager) 
    { 
     _regionManager = regionManager; 
     SubmitCommand = new DelegateCommand(Submit); 
    } 

    private void Submit() 
    { 
     _regionManager.RequestNavigate("Home", new Uri(typeof(UsersView).Name, UriKind.Relative)); 
    } 
} 

的問題是,當我設置「家」的區域是在ItemsControl中,網格(帶轉接器) - 它不」 t輸入KeepAlive屬性,並將第二個視圖添加到該區域,然後我可以看到它們。

當區域定義爲ContentControl或TabControl時 - 它將刪除HomeView並添加UsersView!

誰能告訴我我做錯了什麼?我想用網格作爲區域來實現這一點。

我讀過這章http://msdn.microsoft.com/en-us/library/gg430861%28v=pandp.40%29.aspx,發現沒有答案......

+0

所以你的問題是,你希望網格作爲一個項目控件具有內容控制的行爲? – PVitt 2011-05-31 06:46:49

回答

0

你有兩個類型的控件使用:

ContentControl中和的TabControl將利用SingleActiveRegion使用區域適配器。基本上,一次只能顯示一個視圖。

Grid和ItemsControl可能都是AllActiveRegion(ItemsControl絕對不知道你的GridAdapter),這意味着它們可以一次顯示多個視圖。

望着的NavigationService,這是本地區使用,從視圖X移動,查看Y,這是發生了什麼:

  1. 通知活動視圖,它是不再有效。

  2. 加載起來 新視圖。如果它已經存在(並且視圖實現了IActiveAware),它會對它起反應。否則,創建視圖

  3. 火災的導航事件

  4. 的 新 實例時通知「Y」 認爲它被導航到。同樣,視圖必須執行 IActiveAware

  5. 引發NavigatedEvent。

所以:

不要你的意見實施IActiveAware?

更重要的是,如果您使用的容器可以同時顯示多個視圖(ItemsControl等),那麼我認爲您需要手動從區域中刪除視圖,因爲Prism不打算這樣做爲你!

你實際上可以很容易地做到這一點。您可以編寫自己的實現INavigationService的類,然後將其插入到Region的NavigationService屬性中。這使您可以控制導航服務正在做什麼。

希望這會有所幫助。

相關問題