2

我有以下 ItemsControl,我使用 Canvas 作为面板:

<ItemsControl ItemsSource="{Binding Widgets}">
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type widgetLayoutSpike:ColouredWidget}">
            <Grid Background="{Binding BgColour}">
                <TextBlock Text="{Binding Title}" />
            </Grid>
        </DataTemplate>
    </ItemsControl.Resources>

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <Grid Background="Yellow">
                            <!--  <ContentPresenter />  -->
                        </Grid>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

我的要求是:

  • ItemTemplates 是通过类型化的 DataTemplates 设置的(上面显示了 ColouredWidget 项目类型的示例)。对于不同的项目类型,可能有几个。
  • 我需要能够指定一个 ItemContainer 模板,它包含所有不同的 ItemTemplates。具体用例是我希望这个 ItemContainer 为所有项目(带有按钮等)设置一个公共边框镶边。

Canvas 为每个绑定项目创建一个 ContentPresenter。正如您在上面看到的,我曾希望能够为 ItemContainerStyle 中的 ContentPresenter 指定一个 ContentTemplate,但这不起作用,因为我假设它本质上创建了一个循环引用。

提前致谢!

4

1 回答 1

1

It is perhaps easier to do this with a ListBox instead of an ItemsControl as the container type is a ListBoxItem, which (in contrast to ContentPresenter) has a control template that you can replace in your Style:

<ListBox ItemsSource="{Binding Widgets}">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type widgetLayoutSpike:ColouredWidget}">
            <Grid Background="{Binding BgColour}">
                <TextBlock Text="{Binding Title}" />
            </Grid>
        </DataTemplate>
    </ListBox.Resources>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Grid Background="Yellow">
                            <ContentPresenter Margin="2"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Edit: maybe you have to write

<ContentPresenter Margin="2"
                  Content="{TemplateBinding Content}"
                  ContentTemplate="{TemplateBinding ContentTemplate}"/>
于 2013-08-27T11:07:59.417 回答