Ваш 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 DataTemplateSelector
Есть несколько способов подключить ChangeTabIndexCommand
. Я предпочитаю использовать какую-то систему обмена сообщениями , однако вы также можете подключить событие в конструкторе MainViewModel.