尝试创建一个包含多个项目的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类),我不能同时使用这两个,因为我不知道如何为每个类指定视图!
谢谢!
答案 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>