如何在TabControl的ItemsSource绑定到WPF中的列表时设计TabPage?

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页面中添加新内容.

Fed*_*gui 6

根据以上评论:

为每个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)

  • 吹牛!终于工作了.我把这些行放在我的应用程序的任何地方,但它不起作用;)@HighCore你是一个救生员:) (2认同)