基于Canvas的ItemsControl的ItemContainerStyle

时间:2013-08-27 10:05:53

标签: wpf wpf-controls datatemplate itemscontrol

我有以下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,但这不起作用,因为我认为它基本上创建了一个循环引用。

提前致谢!

1 个答案:

答案 0 :(得分:1)

使用ListBox而不是ItemsControl可能更容易,因为容器类型是ListBoxItem,(与ContentPresenter相比)有一个控件模板可以在你的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>

编辑:也许你必须写

<ContentPresenter Margin="2"
                  Content="{TemplateBinding Content}"
                  ContentTemplate="{TemplateBinding ContentTemplate}"/>