将TabControl绑定到具有不同内容的ObservableCollection

时间:2013-02-21 11:12:23

标签: wpf binding observablecollection tabcontrol

尝试创建一个包含多个项目的tabcontrol的w主窗口(每个项目仅按需显示)...假设我们有类型A的项目,类型B的项目和类型C的项目 我想(使用MVVM模式)有一个可观察的对象集合,代表我的tabitems并且与我的userscontrols相关(每个tabitem是一个usercontrol)... 问题是我没弄明白该怎么做。

我有一个tabItemViewModelBase类:

 public class TabItemViewModelBase : ViewModelBase
    {

        //Fields : 
        RelayCommand _closeCommand;


        //Constructor:
        public TabViewModel(string header)
        {
            this.Header = header;
        }

}

在我的主窗口数据上下文中,我有一个这个类的可观察集合:

 //Propriétés
        ObservableCollection<TabViewModel> _tabItems;

在我的MainWindow中,我为TabControl项目提供了以下标记

 <TabControl Padding="0" ItemsSource="{Binding Path=Workspaces}">
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Header}"/>
                </DataTemplate>
            </TabControl.ItemTemplate>
            <TabControl.ContentTemplate>
                <DataTemplate>
                    **<view:ClientView/>**
                </DataTemplate>
            </TabControl.ContentTemplate>

        </TabControl>

但正如您所看到的,所有项目都附加到ClientView用户控件,并且我使用tabviewitem来创建我的项目,我需要一个属性或方法来为observablecollection的每个元素指定内容表单...

(我有一个ClientListingViewModel类和ClientCreationViewModel类),我不能同时使用这两个,因为我不知道如何为每个类指定视图!

谢谢!

1 个答案:

答案 0 :(得分:4)

要指定针对特定视图模型的视图,可以在datatemplate中执行此操作。

首先,您需要为视图和viewmodel命名空间添加命名空间引用。我已经包含了一个使用Window的示例,但它也适用于UserControls。

<Window ...
        xmlns:v="clr-namespace:PutYourViewNamespaceHere"
        xmlns:vm="clr-namespace:PutYourViewModelNamespaceHere">

接下来,您需要在容器的资源部分中定义datatemplates。 在下面的示例中,我使用ClientListingView作为ClientListingViewModel的数据窗口

<Window.Resources>
     <DataTemplate DataType="{x:Type vm:ClientListingViewModel">
          <v:ClientListingView />
     </DataTemplate>
     <DataTemplate DataType="{x:Type vm:ClientCreationViewModel">
          <v:ClientCreationView />
     </DataTemplate>
</Window.Resources>