2014-01-30 169 views
0

當前當我按下按鈕時,它們會生成新頁面並在頂部創建一個新選項卡。我試圖提出一個案例,如果該選項卡已經創建,它將被重定向到工作區。請給我一些提示或指導。選項卡打開冗餘

public void Show(string name) 
    { 
     IGridPort tab; 
     switch (name) 
     { 
      case "Contacts":  tab = new ContactsGridViewModel(Events); break; 
      case "Businesses":  tab = new ClientGridViewModel(Events); break; 
      default:    tab = new QuickLaunchViewModel(Events); break; 
     } 
     Events.Publish(new ShowTabEvent(tab)); 
    } 

回答

0

在我的應用我通常叫PageViewModel每個主要頁面的選項卡,並呼籲DataPageViewModel派生類,用於顯示應該只出現一次頁面的基類(如多數民衆贊成正在編輯的記錄)。我保持PageViewModel可觀察集合來傳遞的的ItemsSource到我的標籤控件和我還保持DataPageViewModel一本字典,所以我可以看看他們基於他們顯示數據:

public ObservableCollection<PageViewModel> Pages { get; private set; } 
private Dictionary<string, DataPageViewModel> DataPages { get; set; } 

,我使用的字符串鍵入字典通常是頁面類型和正在顯示的數據的唯一標識符的組合。那麼剩下的就是在創建頁面之前檢查字典,看看顯示該數據的另一個頁面是否已經存在,如果存在,那麼只需將該頁面設置爲活動頁面。設置活躍頁面可以通過獲取的ObservableCollection的默認視圖,並呼籲MoveCurrentTo可以做到,但在MVVM一個更好的方法是創建模型中的屬性來保存當前活動頁面:

private PageViewModel _CurrentPage; 
    public PageViewModel CurrentPage 
    { 
     get { return _CurrentPage; } 
     set { _CurrentPage = value; RaisePropertyChanged(() => this.CurrentPage); } 
    } 

然後,只需將它綁定到的SelectedItem在您的標籤控件:

<TabControl 
     ItemsSource="{Binding Pages}" 
     SelectedItem="{Binding CurrentPage, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
     IsSynchronizedWithCurrentItem="True" /> 

結合是雙向的,所以如果用戶選擇了一個選項卡,然後當前頁將隨之更新,如果你在你的視圖模型集當前頁,則相應的標籤將被選中風景。