【问题标题】:how to set the generated item for itemscontrol in databinding?如何在数据绑定中设置itemscontrol的生成项?
【发布时间】:2012-03-15 13:25:59
【问题描述】:

如果我使用列表框进行数据绑定,列表框会为每个项目生成一个列表框项,组合框和组合框项也是如此。 我的问题是 - 我如何为给定的 ItemsControl 自己设置它? (例如,将包含元素设为 Border)?

【问题讨论】:

标签: c# wpf data-binding


【解决方案1】:

用于包装每个项目的默认项目是ContentPresenter

我不确定您为什么要覆盖它,因为它没有视觉外观或特定行为会干扰您的 UI。

如果您想将每个项目包装在Border 对象中,您可以设置ItemTemplate

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Border BorderBrush="Blue" BorderThickness="2">
            <TextBlock Text="{Binding }" />
        </Border>
    </DataTemplate>
</ItemsControl.ItemTemplate>

如果您想将任何特定样式应用于ContentPresenter,请设置ItemContainerStyle

<ItemsControl.ItemContainerStyle>
    <Style>
        <Setter Property="Grid.Column" Value="{Binding ColumnIndex}" />
        <Setter Property="Grid.Row" Value="{Binding RowIndex}" />
    </Style>
</ItemsControl.ItemContainerStyle>

【讨论】:

  • +1 ItemsContainerSyle 中边框的语法是什么?
  • @Blam ContentPresenter 根本没有任何视觉外观,包括没有边框元素。它只是一个容器对象,用于保存内容。如果要给每个项目一个Border,则需要将项目包装在Border 对象中,例如我在ItemTemplate 中。默认内容是绑定到对象的 TextBlock,尽管用其他内容覆盖它是相当常见的。
  • 这不是我所要求的。每当您对项目控件进行数据绑定时,它都会为列表中的每个项目生成一个包含元素。我想替换包含元素,而不仅仅是添加一个边框来包含我的模板。
  • @EladKatz 出于好奇,为什么要替换它?
  • 出于同样的原因,列表框需要替换它的项目容器......再次 - 这是我要求开始的。
【解决方案2】:

在用 ILSpy 挖掘了一点之后 -

显然魔法是在

中完成的
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new ListBoxItem();
    }

这就是 ListBox 的作用——在我的控制下,我也应该覆盖它。

【讨论】:

  • 您确定这是正确的方法吗?自定义样式对我来说似乎不那么复杂。
  • 自定义样式在我的情况下是不够的。如果您再次查看我的问题,您会发现这就是我要求开始的内容..
  • 要么我不明白你的问题,要么你不明白自定义样式,我再读一遍(慢慢地)但没有改变意见。
猜你喜欢
  • 1970-01-01
  • 2016-09-09
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
相关资源
最近更新 更多