Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 如何使用viewmodel绑定和更改选项卡控件中的页面?_Silverlight_Mvvm_Tabcontrol - Fatal编程技术网

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

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将更

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

  • 如何将页面加载到选项卡项
  • 如何更改选项卡项中的页面
  • 以上问题已由Rachel解决,谢谢

  • 我想在选项卡Item1中显示page1和page2,单击page1中包含的按钮时,page1将消失,page2将显示

  • 谢谢。

    您的
    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中加载其他页面。谢谢