在我的應用我通常叫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" />
結合是雙向的,所以如果用戶選擇了一個選項卡,然後當前頁將隨之更新,如果你在你的視圖模型集當前頁,則相應的標籤將被選中風景。