Привязка шаблонов данных (или другой подход) - PullRequest
1 голос
/ 14 июня 2010

У меня возникают некоторые проблемы при попытке динамически генерировать контент в WPF и после того, как он связывает данные.

У меня есть следующий сценарий: TabControl - Динамически генерируемые TabItems через DataTemplate - внутри TabItems, у меня генерируется динамический контентDataTemplate, которое я хочу связать (ListBox).

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

:: TabControl

<TabControl Height="252" HorizontalAlignment="Left" Name="tabControl1" VerticalAlignment="Top" Width="458" Margin="12,12,12,12" ContentTemplate="{StaticResource tabItemContent}"></TabControl>

:: Шаблон для TabControl для генерации TabItems

<DataTemplate x:Key="tabItemContent">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <ListBox ItemTemplate="{StaticResource listBoxContent}" ItemsSource="{Binding}">
            </ListBox>
        </Grid>
    </DataTemplate>

:: Шаблон для ListBox Внутри каждого TabItem

<DataTemplate x:Key="listBoxContent">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="22"/>
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Image Grid.Column="0" Source="{Binding Path=PluginIcon}" />
            <TextBlock Grid.Column="1" Text="{Binding Path=Text}" />
        </Grid>        
    </DataTemplate>

Итак, когда я пытаюсь сделать это для кода внутри цикла, чтобы создать табитемы:

TabItem tabitem = tabControl1.Items[catIndex] as TabItem;
   tabitem.DataContext = plugins.ToList();

где 'plugins' - Enumerable

ListBox не ограничен.Я также попытался найти ListBox внутри TabItem, чтобы установить свойство ItemSource, но безуспешно.

Как мне это сделать?

1 Ответ

0 голосов
/ 14 июня 2010

Шаблон для TabControl использует ContentPresenter для представления SelectedContent, например:

 <ContentPresenter Content="{TemplateBinding SelectedContent}"
                   ContentTemplate="{TemplateBinding ContentTemplate}" />

Работа ContentPresenter в жизни заключается в расширении DataTemplate. При этом он устанавливает для DataContext построенного визуального дерева свое свойство Content, которое в этом случае связано с SelectedContent.

SelectedContent устанавливается из свойства Content элемента TabItem, не его DataContext. Поэтому установка DataContext для TabItem не устанавливает DataContext в визуальном дереве области содержимого.

То, что вы хотите:

tabItem.Content = plugins.ToList();
...