Silverlight 如何使用viewmodel绑定和更改选项卡控件中的页面?
我有三个xaml页面和相关的ViewModels: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中实现。我的问题是:Silverlight 如何使用viewmodel绑定和更改选项卡控件中的页面?,silverlight,mvvm,tabcontrol,Silverlight,Mvvm,Tabcontrol,我有三个xaml页面和相关的ViewModels: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将更
谢谢。您的
MainPageViewModel
应该包含选项卡控件中的页面以及所选页面的集合。它还应该包含一个将更改当前页面的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;
}
//这些应该是引发PropertyChange通知的完整属性
公共ObservableCollection选项卡{get;set;}
public int SelectedTabIndex{get;set;}
私有ICommand changeTableIndexCommand{get;set;}
MainPageViewModel()
{
Tabs=新的ObservableCollection();
Tabs.Add(新的Page1ViewModel());
添加(新的Page2VieWModel());
SelectedTab=0;
ChangeTabIndexCommand=新的中继命令(ChangeTab);
}
void ChangeTab(int newIndex)
{
如果(newIndex>=0&&newIndex
您的主视图如下所示:
<TabControl ItemsSource="{Binding Tabs}" SelectedIndex="{Binding SelectedIndex}" />
如果您使用的是Silverlight 5,我相信您可以使用隐式数据模板
,但是如果没有,您必须使用数据模板选择器
或转换器
来告诉Silverlight如何绘制每个视图模型。我通常使用DataTemplateSelector
有许多方法可以连接
ChangeTabIndexCommand
。我倾向于使用某种类型的,但是您也可以在MainViewModel的构造函数中连接事件。Rachel,谢谢您的回答,这对我很有用。还有一些其他问题:如何在一个TabItem中显示不同的页面,以及如何公开页面中包含的事件(而不是主页)以在同一个TabItem中加载其他页面。谢谢