【发布时间】:2012-03-15 13:25:59
【问题描述】:
如果我使用列表框进行数据绑定,列表框会为每个项目生成一个列表框项,组合框和组合框项也是如此。 我的问题是 - 我如何为给定的 ItemsControl 自己设置它? (例如,将包含元素设为 Border)?
【问题讨论】:
标签: c# wpf data-binding
如果我使用列表框进行数据绑定,列表框会为每个项目生成一个列表框项,组合框和组合框项也是如此。 我的问题是 - 我如何为给定的 ItemsControl 自己设置它? (例如,将包含元素设为 Border)?
【问题讨论】:
标签: c# wpf data-binding
用于包装每个项目的默认项目是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>
【讨论】:
ContentPresenter 根本没有任何视觉外观,包括没有边框元素。它只是一个容器对象,用于保存内容。如果要给每个项目一个Border,则需要将项目包装在Border 对象中,例如我在ItemTemplate 中。默认内容是绑定到对象的 TextBlock,尽管用其他内容覆盖它是相当常见的。
在用 ILSpy 挖掘了一点之后 -
显然魔法是在
中完成的 protected override DependencyObject GetContainerForItemOverride()
{
return new ListBoxItem();
}
这就是 ListBox 的作用——在我的控制下,我也应该覆盖它。
【讨论】: