【问题标题】:Binding DataTemplates (or another approach)绑定数据模板(或其他方法)
【发布时间】:2011-03-03 08:21:15
【问题描述】:

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

我有以下情况: 选项卡控件 - 通过 DataTemplate 动态生成 TabItems - 在 TabItems 中,我有希望绑定的由 DataTemplate 生成的动态内容(列表框)。

代码如下:

::TabControl

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

::TabControl生成TabItem的模板

<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' 是可枚举的

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

我该怎么做?

【问题讨论】:

    标签: wpf data-binding datatemplate datacontext itemssource


    【解决方案1】:

    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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-09
      • 2021-12-25
      • 2011-04-30
      • 2014-08-23
      • 1970-01-01
      • 2011-11-08
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多