1

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

我有以下场景: TabControl - 通过 DataTemplate 动态生成的 TabItems - 在 TabItems 内,我有由 DataTemplate 生成的我希望绑定的动态内容(列表框)。

代码如下:

::选项卡控件

<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 属性,但根本没有成功。

我怎么做?

4

1 回答 1

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();
于 2010-06-14T07:09:28.563 回答