Templating ItemsControl项目,不使用ItemsSource

时间:2011-09-26 19:54:06

标签: silverlight xaml datatemplate itemscontrol

我正在尝试构建自定义Silverlight ItemsControl。我希望此控件的用户使用XAML添加项目。这些项目将是其他UI元素。我想在所有添加的项目周围添加一个边距,因此我想添加一个ItemTemplate。

我试图使用ItemsControl.ItemTemplate来做这件事,但是在绑定到XAML中的元素时似乎没有使用它,即使用ItemsControl.Items属性。 但是,如果我使用ItemsControl.ItemsSource属性,则使用ItemTemplate。

即使我没有分配ItemsSource,还是使用ItemTemplate吗?

这是我目前的代码

<ItemsControl x:Class="MyControl">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate >
            <toolkit:WrapPanel/>            
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>
        <DataTemplate>           
            <StackPanel Margin="20" Background="Red">
                <TextBlock Text="Test text"/>
                <ContentPresenter Content="{Binding}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>        


    <ItemsControl.Template>
        <ControlTemplate>
            <Border>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>

                    <ItemsPresenter x:Name="ItemsPresenter"/>

                    <Button Command="{Binding SearchCommand}"/>
                </Grid>
             </Border>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>

当我使用我的控件时

<MyControl>
    <Button Content="Button"/>
    <Button Content="Button"/>
</MyControl>

这让我看到了项目的显示,带有换行面板布局但没有应用数据模板。 然后我发现this post提到了两种要覆盖的方法。

儿子在我现在的班级代码隐藏中

protected override bool IsItemItsOwnContainerOverride(object item)
{
    return false;
}

protected override void PrepareContainerForItemOverride(DependencyObject element,  
        object item)
{
    base.PrepareContainerForItemOverride(element, item);
    ((ContentPresenter)element).ContentTemplate = ItemTemplate;
}

但是 - 这给了我两个项目,风格(I.E是红色文本块)但没有实际内容。列表中的按钮未添加。感觉我做错了什么 - 关于什么的任何指针?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果你只想添加一些余量,那么你可以设置ItemContainerStyle而不是指定模板:

<ItemsControl>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="FrameworkElement.Margin" Value="10" /> <!-- or whatever margin you want -->
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

这将允许您通过样式设置容器控件的任何属性(在ItemsControl的情况下将是ContentControl)。