Привязка TabControl ItemsSource к коллекции ViewModels
по какой-то причине у меня чертовски много времени, чтобы получить мой TabControl
для правильного отображения при связывании ItemsSource
до ObservableCollection
модели представления. Я основываю свой дизайн на учебнике, найденном здесь:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx. Я нашел здесь несколько вопросов, подобных моему, но ни один из них не касался моей конкретной ситуации.
Это мой TabControl
в xaml.
<TabControl ItemsSource="{Binding Workspaces}"
SelectedIndex="{Binding ActiveWorkspaceIndex}"
ItemTemplate="{StaticResource ClosableTabItemTemplate}"/>
здесь ClosableTabItemTemplate
следующий.
<DataTemplate x:Key="ClosableTabItemTemplate">
<DockPanel Width="120">
<Button
Command="{Binding Path=CloseCommand}"
Content="X"
Cursor="Hand"
DockPanel.Dock="Right"
Focusable="False"
FontFamily="Courier"
FontSize="9"
FontWeight="Bold"
Margin="0,1,0,0"
Padding="0"
VerticalContentAlignment="Bottom"
Width="16" Height="16"
/>
<ContentPresenter
Content="{Binding Path=DisplayName}"
VerticalAlignment="Center"
/>
</DockPanel>
</DataTemplate>
Workspaces
это ObservableCollection
модели представления. ActiveWorkspaceIndex
- это только активный индекс рабочей области, который я отслеживаю в модели представления. Я связываю свою модель представления с экземпляром представления через следующий шаблон данных в моем приложении.файл XAML.
<DataTemplate DataType="{x:Type vm:ViewModelStartPage}">
<v:ViewStartPage/>
</DataTemplate>
я добавляю только одну модель представления в свою коллекцию рабочих областей. Я вижу, что 2 представления отображаются в элементе управления tab, и они не вкладываются. Это почти как TabControl не знает, чтобы рассматривать различные представления как TabItems, его поведение больше похоже на стек панель, укладка видов. Если я создаю элементы вкладки в коде, он отлично работает следующим образом:
System.Windows.Controls.TabItem i = new System.Windows.Controls.TabItem();
i.Content = new Views.ViewStartPage();
i.Header = "A Tab Item";
this.xTabControl.Items.Add(i);
Я должен отсутствовать некоторые шаблон контент или что-то. Я буду стилизовать свои вкладки позже, но сейчас я был бы рад просто получить основные вкладки. Кроме того, представления в содержимом вкладки могут отличаться для каждой вкладки, поэтому я не могу использовать простые примеры шаблонов TextBlock TabControl, которые я вижу повсюду... Т. е. только не это...
<TabControl.ContentTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Content}" />
</DataTemplate>
какие идеи?
1 ответов
Я закончил тем, что использовал ContentControl
С TabControl
шаблон данных (например, исходный проект учебника). Вот код xaml, с которым я закончил. Я не изменил код из исходного образца проекта, чтобы сделать эту работу. The ContentControl
находится в моем главном окне.xaml и две другие части кода были в ResourceDictionary
.
<!-- Workspaces Tab Control -->
<ContentControl Grid.Row="1"
VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
Content="{Binding Path=Workspaces}"
ContentTemplate="{StaticResource WorkspacesTemplate}"/>
<!-- Workspaces Template -->
<DataTemplate x:Key="WorkspacesTemplate">
<TabControl Style="{StaticResource ClosableTabControl}"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding}"
ItemTemplate="{StaticResource WorkspaceTabItemTemplate}"
Margin="1"/>
</DataTemplate>
<!-- Workspace Tab Item Template -->
<DataTemplate x:Key="WorkspaceTabItemTemplate">
<Grid Width="Auto" Height="Auto">
<ContentPresenter ContentSource="Header" Margin="3"
Content="{Binding Path=DisplayName}"
HorizontalAlignment="Center" VerticalAlignment="Center">
<ContentPresenter.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource Foreground}"/>
</Style>
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
</DataTemplate>