不使用 ItemsSource 模板化 ItemControl 项

发布于 2024-12-06 18:18:08 字数 2385 浏览 0 评论 0原文

我正在尝试构建自定义 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>

这让我显示了项目,带有包装面板布局,但没有应用数据模板。 然后我发现这篇文章提到了两种重写方法。

儿子在我现在拥有的类的代码隐藏中,

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 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 Content="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!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

╰◇生如夏花灿烂 2024-12-13 18:18:08

如果您只想添加一些边距,那么您只需设置 ItemContainerStyle 而不必指定模板:

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

这将允许您设置容器控件的任何属性(在 <通过样式,code>ItemsControl 将成为 ContentControl)。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文