我有三个xaml页面和相关的ViewModel:main.xaml,MainViewModel.cs; page1.xaml,Page1ViewModel.cs; page2.xaml,page2ViewModel.cs。 main.xaml中有一个TabControl。 我想在应用程序初始化时加载并在TabItem中显示page1.xaml,并在单击page1.xaml中包含的按钮时将page1.xaml更改为page2.xaml;单击page2.xaml中包含的按钮时,page2.xaml将更改为page1.xaml。
所有事件或命令都需要在ViewModels中实现。我的问题:
以上问题已由Rachel解决,谢谢。
感谢。
答案 0 :(得分:1)
您的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's DataTemplateSelector
有多种方法可以连接ChangeTabIndexCommand
。我的偏好是使用某种Messaging System,但您也可以在MainViewModel的构造函数中挂接事件。