Шаблоны элементов WPF - TabControl - PullRequest
1 голос
/ 23 августа 2011

Я пишу приложение, в котором я использую элемент управления вкладками, который начинается с одной открытой вкладки, но позволяет пользователю открывать несколько других вкладок.

Каждая открытая вкладка должна иметь древовидное представление, внутри которого я заполняю, используя привязку данных, когда пользователь загружает файл.

Я новичок в WPF, но я чувствую, что есть способ, которым я могу создать шаблон, содержащий каждый из элементов, которые должны содержать TabItems. Как я могу сделать это с помощью шаблонов? Прямо сейчас мой WPF для элементов вкладки выглядит следующим образом

<TabItem Header="Survey 1">
        <TreeView Height="461" Name="treeView1" VerticalAlignment="Top" 
                  Width="625" Margin="0,0,6,0" ItemTemplateSelector="{StaticResource TreeviewDataSelector}" />
 </TabItem>

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

Я думаю, вы хотите что-то вроде этого:

<Window x:Class="TestWpfApplication.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
<Window.Resources>
    <DataTemplate x:Key="TabItemTemplate">
        <TreeView Height="461" Name="treeView1" VerticalAlignment="Top" 
                    Width="625" Margin="0,0,6,0" ItemTemplateSelector="{StaticResource TreeviewDataSelector}" />
    </DataTemplate>

</Window.Resources>
<Grid>
    <TabControl ItemsSource="{Binding ListThatPowersTheTabs}"
                ItemTemplate="{StaticResource TabItemTemplate}">
    </TabControl>
</Grid>

В основном вы создаете повторно используемые шаблоны в качестве статических ресурсов, к которым вы обращаетесь по имени их ключа.

2 голосов
/ 23 августа 2011

Обычно в такой ситуации я привязываю свой TabControl.ItemsSource к ObservableCollect<ViewModelBase> OpenTabs, поэтому моя ViewModel отвечает за добавление / удаление новых вкладок по мере необходимости.

Затем, если вы хотите что-то в каждой вкладке, перезапишите TabControl.ItemTemplate и используйте следующую строку, чтобы указать, где отображать текущий выбранный TabItem

<ContentControl Content="{Binding }" />

Если вам не нужно настраивать что-либо на каждой вкладке, вам не нужно перезаписывать TabControl.ItemTemplate - по умолчанию будет отображаться выбранный ViewModelBase на вкладке.

И я использую DataTemplates, чтобы указать, какое представление использовать

<DataTemplate TargetType="{x:Type local:TabAViewModel}">
    <local:TabAView />
</DataTemplate>

<DataTemplate TargetType="{x:Type local:TabBViewModel}">
    <local:TabBView />
</DataTemplate>

<DataTemplate TargetType="{x:Type local:TabCViewModel}">
    <local:TabCView />
</DataTemplate>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...