您的MainPageViewModel
應該包含TabControl和SelectedPage中的頁面的集合。它也應該包含一個ICommand
這將改變當前頁面。
例如,
// These should be full properties that raise PropertyChange notifications
public ObservableCollection<IPageViewModel> Tabs { get; set; }
public int SelectedTabIndex { get; set; }
private ICommand ChangeTabIndexCommand { get; set; }
MainPageViewModel()
{
Tabs = new ObservableCollection<IPageViewModel>();
Tabs.Add(new Page1ViewModel());
Tabs.Add(new Page2VieWModel());
SelectedTab = 0;
ChangeTabIndexCommand = new RelayCommand<int>(ChangeTab);
}
void ChangeTab(int newIndex)
{
if (newIndex >= 0 && newIndex < Tabs.Count())
SelectedTab = newIndex;
}
你的MainView是這樣的:
<TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedIndex}" />
如果您在使用Silverlight 5,我相信你可以使用隱DataTemplates
,但是如果沒有你就必須使用類似於DataTemplateSelector
或Converter
的東西來告訴Silverlight如何繪製每個ViewModel。我通常使用Microsoft PRISM'sDataTemplateSelector
有很多方法可以連接ChangeTabIndexCommand
。我的首選是使用某種Messaging System,但是您也可以在MainViewModel的構造函數中掛接事件。
Rachel,謝謝你的回答,對我有用。還有其他一些問題:如何在TabItem中顯示不同的頁面,以及如何在頁面(而不是主頁面)中公佈事件,以在同一個TabItem中加載其他頁面。謝謝。 – zclmoon 2012-02-07 01:59:25