Привязка для элементов управления содержимым TabItem - PullRequest
0 голосов
/ 17 ноября 2010

У меня есть 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, используемый на соответствующей вкладке, Имя отображается в заголовке вкладки,и данные, которые должны отображаться в содержимом вкладки, т.е. DataGrid.Для данных установлено ObservableCollections разных типов.

DataTemplate может выглядеть следующим образом:

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

Я пробовал разные способы привязать свойство Data к ItemsSource DataGrid, но все, что я получил, - это слово, отображающее сетку"Book" (значение свойства BookTab's Name).Я предполагаю, что мне нужно каким-то образом распространять привязку TabControl к DataGrid, но я не могу понять это.

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Я бы сделал это так:

<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 голосов
/ 17 ноября 2010

ваш контекст данных сетки данных, вероятно, BookTab (вы можете подтвердить это, используя snoop )

Если это правильно, все, что вам нужно сделать, это привязать источник элементов сетки данных к свойству BookTab Data

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

Это должно сработать

...