0

'正在尝试创建 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 类),我不能同时使用它们,因为我不知道如何为它们中的每一个指定视图!

谢谢!

4

1 回答 1

4

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

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

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

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

<Window.Resources>
     <DataTemplate DataType="{x:Type vm:ClientListingViewModel">
          <v:ClientListingView />
     </DataTemplate>
     <DataTemplate DataType="{x:Type vm:ClientCreationViewModel">
          <v:ClientCreationView />
     </DataTemplate>
</Window.Resources>
于 2013-02-21T11:37:33.217 回答