首页 文章

绑定TabItem的内容控件

提问于
浏览
0

我有一个TabControl,ItemsSource设置为 ObservableCollection<BookTab> 并使用ContentTemplateSelector创建不同的选项卡 .

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>

BookTab中的类型确定在相应选项卡中使用的DataTemplate,名称显示在选项卡 Headers 上,而数据应显示在选项卡的内容中,即DataGrid . 数据设置为不同类型的ObservableCollections .

DataTemplate可能如下所示:

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

我尝试了不同的方法将Data属性绑定到DataGrid的ItemsSource,但我得到的只是网格显示单词“Book”(BookTab的Name属性值) . 我的猜测是我必须以某种方式将TabControl的绑定传播到DataGrid,但我无法弄明白 .

2 回答

  • 0

    我会这样做:

    <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

  • 1

    您的datagrid数据上下文可能是BookTab(您可以使用snoop确认)

    如果这是正确的,您所要做的就是将datagrid itemssource绑定到BookTab Data属性

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

    这应该可以解决问题

相关问题