开发者

Templating ItemControl items without using ItemsSource

开发者 https://www.devze.com 2023-04-08 00:32 出处:网络
I am trying to build a custom Silverlight ItemsControl. I want the users of this control to add items using XAML. The items will be other UI elements. I would like to add a margin around all added ite

I am trying to build a custom Silverlight ItemsControl. I want the users of this control to add items using XAML. The items will be other UI elements. I would like to add a margin around all added items and therefore I want to add an ItemTemplate.

I am trying to do this using the ItemsControl.ItemTemplate, but that does not seem to be used when binding to elements in XAML, i.e using the ItemsControl.Items property. However, if I use the ItemsControl.ItemsSource property, the ItemTemplate is used.

Is there anyway to use the ItemTemplate even though I am not assigning ItemsSource?

This is my code so far

<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>

And when I use my control

<MyControl>
    <Button Conten开发者_运维知识库t="Button"/>
    <Button Content="Button"/>
</MyControl>

This got me a display of the items, with a wrap panel layout but no applied data template. Then I found this post that mentioned two methods to override.

Son in my code-behind of the class I have now

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

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

BUT - this gets me two items, with the style (I.E a red textblock) but no actual content. The buttons in the list are not added. It feels like I am doing something wrong - any pointers on what?

Thanks!


If all you want to do is add some margin then you can just set the ItemContainerStyle instead of specifying a template:

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

This will allow you to set any property of the container control (which in the case of an ItemsControl will be a ContentControl) through the style.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号