Meh*_*deh 6 .net c# wpf xaml tabcontrol
这些是我的类:
class mainViewModel
{
public List<Foo> F { get; set; }
public mainViewModel()
{
F=new List<Foo>()
{
new Foo(new Animal(){Name = "Cat"}),
new Foo(new Animal(){Name = "Dog"}),
new Foo(new Animal(){Name = "Camel"})
};
}
}
public class Foo
{
public Animal Animal { get; set; }
public Foo(Animal animal)
{
Animal = animal;
}
}
public class Animal
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的MainWindow Xaml代码:
<TabControl ItemsSource="{Binding Path=F}">
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Animal.Name}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock Text="Something 1"/>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
现在显然我将TabControl在列表中为每个项目创建一个页面,F并且所有TabControl页面都有一个TextBlock Something 1,如下所示:

我想要的只是设计其中一个页面.比如在button名为Something 3的Camel页面中添加新内容.
根据以上评论:
为每个Tab创建一个特定的ViewModel类:
public class Tab1: ViewModelBase
{
//... functionality, properties, etc
}
public class Tab2: ViewModelBase
{
//... functionality, properties, etc
}
public class Tab3: ViewModelBase
{
//... functionality, properties, etc
}
Run Code Online (Sandbox Code Playgroud)
然后为每个创建一个特定的视图(通常以UserControls的形式):
<UserControl x:Class"UserControl1" ...>
<!-- UI Elements, etc -->
</UserControl>
<UserControl x:Class"UserControl2" ...>
<!-- UI Elements, etc -->
</UserControl>
<UserControl x:Class"UserControl3" ...>
<!-- UI Elements, etc -->
</UserControl>
Run Code Online (Sandbox Code Playgroud)
然后DataTemplates为每个ViewModel类型创建并将它们UserControls放入其中:
编辑:这些应该在App.xaml下面定义Application.Resources:
<Application ....>
<Application.Resources>
<DataTemplate DataType="{x:Type local:ViewModel1}">
<local:UserControl1/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModel2}">
<local:UserControl2/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModel3}">
<local:UserControl2/>
</DataTemplate>
</Application.Resources>
</Application>
Run Code Online (Sandbox Code Playgroud)
最后,ObservableCollection<ViewModelBase>在主ViewModel中添加一个并添加以下项:
public ObservableCollection<ViewModelBase> Tabs {get;set;} //Representing each Tab Item
public MainViewModel() //Constructor
{
Tabs = new ObservableCollection<ViewModelBase>();
Tabs.Add(new ViewModel1());
Tabs.Add(new ViewModel2());
Tabs.Add(new ViewModel2());
}
Run Code Online (Sandbox Code Playgroud)