如何使用viewmodel绑定和更改选项卡控件中的页面?

时间:2012-02-06 03:08:58

标签: silverlight mvvm tabcontrol

我有三个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中实现。我的问题:

  1. 如何将页面加载到TabItem?
  2. 如何更改TabItem中的页面?
  3. 以上问题已由Rachel解决,谢谢。

    1. 我想在TabItem1中显示page1和page2,page1将消失,当点击第1页中包含的按钮时,page2将会显示。
    2. 感谢。

1 个答案:

答案 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,但如果不是,则必须使用类似DataTemplateSelectorConverter的内容来告诉Silverlight绘制每个ViewModel。我通常使用Microsoft PRISM's DataTemplateSelector

有多种方法可以连接ChangeTabIndexCommand。我的偏好是使用某种Messaging System,但您也可以在MainViewModel的构造函数中挂接事件。