2011-04-13 69 views
1

我有兩個區域。導航區域和主要區域。C#Prism導航問題

我的導航區域包含兩個調用RequestNavigate方法的按鈕。 第一個按鈕載荷的視圖不帶任何參數

this.tRegionManager.RequestNavigate(RegionNames.MainRegion, ViewNames.VInfoMainViewUri); 

第二個按鈕應與一些參數

this.tRegionManager.RequestNavigate(RegionNames.MainRegion, new Uri(ViewNames.VInfoMainViewUri.OriginalString + "" + query.ToString(), UriKind.Relative)); 

,如果沒有視圖被加載這工作正常加載相同的圖。如果加載了任何視圖,則單擊任何按鈕都不會導致任何結果。

我想從我的區域刪除所有活動視圖,但是這會導致錯誤

IViewsCollection col = tRegionManager.Regions[args.RegionName].Views; 
foreach (var obj in col) 
{ 
    tRegionManager.Regions[args.RegionName].Remove(obj); 

} 

該區域不包含指定的視圖。 參數名稱:查看

我該如何解決這個問題?

回答

5

如果你想創建一個新的視圖,即使已經有一個相同類型的現有視圖,你需要在你的View或你的ViewModel中實現INavigationAware接口(Prism將首先檢查視圖,如果它不執行INavigationAware它也會檢查ViewModel)。

特別感興趣的是IsNavigationTarget方法,該方法告訴Prism應該重用View的當前實例還是創建另一個實例來滿足導航請求。因此,要始終創建一個新的視圖,你會怎麼做:

public class MyViewModel : INavigationAware { 
    bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext) 
    { 
     return false; 
    } 

    void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext) 
    { 
    } 

    void INavigationAware.OnNavigatedTo(NavigationContext navigationContext) 
    { 
    } 
} 

所有這一切都在更詳細的棱鏡4文檔的第8章解釋;他們也有an illustration of how it works

+0

謝謝你的作品很棒:) – Cr3at0rX 2011-04-13 11:14:40