绑定数据模板(或其他方法)

时间:2010-06-14 00:48:54

标签: wpf data-binding datatemplate datacontext itemssource

我在尝试动态生成WPF中的内容以及绑定数据之后遇到了一些麻烦。

我有以下情况: 的TabControl   - 通过DataTemplate动态生成TabItems   - 在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>

::每个TabItem内的ListBox模板

<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>

所以,当我尝试在循环内的代码上执行此操作以创建tabitems时:

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

其中'plugins'是Enumerable

ListBox不受限制。 我还尝试在TabItem中找到ListBox来设置ItemSource属性,但根本没有成功。

有人知道如何做到这一点? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

TabControl的模板使用ContentPresenter来呈现SelectedContent,如下所示:

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

ContentPresenter在生活中的工作是扩展DataTemplate。当它这样做时,它将构造的可视树的DataContext设置为其Content属性,在这种情况下绑定到SelectedContent。

SelectedContent是从TabItem的Content属性设置的,不是它的DataContext。因此,在TabItem上设置DataContext不会在内容区域的可视树上设置DataContext。

你想要的是:

tabItem.Content = plugins.ToList();