2010-11-17 47 views
0

我有一个TabControl的ItemsSource设置为ObservableCollection<BookTab>并使用ContentTemplateSelector创建不同的选项卡。绑定TabItem的内容控件

class BookTab 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 
    public object Data { get; set; } 
} 

<TabControl Name="tabControl" 
      ContentTemplateSelector="{StaticResource tabTemplateSelector}"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="TabItem"> 
      <Setter Property="Header" Value="{Binding Name}"/> 
      <Setter Property="Content" Value="{Binding}"/> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 

Type在BookTab确定的DataTemplate在相应的标签所使用的,名称被显示在选项卡头和数据应该被显示在选项卡的内容,即,数据网格。 数据设置为不同类型的ObservableCollections。

DataTemplate中看起来是这样的:

<DataTemplate x:Key="bookTabTemplate"> 
    <TabItem Name="bookTab"> 
     <Grid> 
      <DataGrid Name="bookGrid"> 
       ... 
      </DataGrid> 
     </Grid> 
    </TabItem> 
</DataTemplate> 

我试图将数据绑定属性DataGrid的ItemsSource时不同的方式,但我得到的是网格中显示单词“书”(BookTab的名称属性值)。 我的猜测是我必须以某种方式传播TabControl的绑定到DataGrid,但我无法弄清楚。

回答

1

我会做这样的:

<TabControl SelectedItem="{Binding CurrentBook}" 
      IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding BookList}"> 
<TabControl.ContentTemplate> 
    <DataTemplate> 
    <Grid> 
     <ContentControl Content="{Binding Data}" 
    </Grid> 
    </DataTemplate> 
</TabControl.ContentTemplate> 
<TabControl.ItemTemplate> 
    <DataTemplate> 
    <TextBlock Text="{Binding Name}"/> 
    </DataTemplate> 
</TabControl.ItemTemplate> 
</TabControl> 

...后来你在App.xaml中如何您的数据的内容呈现定义...

<DataTemplate DataType="{x:Type viewmodel:bookviewmodel1}"> 
     <view:bookview1/> 
    </DataTemplate> 

所有你必须要做的是为每种类型创建一个视图(usercontrol)。

HTH

0

您的数据网格数据上下文可能是BookTab(你可以确认这一点使用snoop

如果这是正确的,你所要做的就是将DataGrid的ItemsSource绑定到BookTab数据属性

<DataGrid Name="bookGrid" ItemsSource="{Binding Path=Data}" /> 

这应该好诀窍