【发布时间】:2010-08-25 14:12:55
【问题描述】:
我有以下问题: 我必须在某种网格中显示表格数据。
说 A 类是一个数据项,具有属性 Foo 和 Bar,我有一个项目列表 List 或类似的东西。我想在网格中显示这些项目,其中具有相同 Foo 的项目在一列中,而具有相同 Bar 的项目在一列中。基本的。简单的。我想?
我最初的尝试是创建一个 ItemsControl,使用 Grid 作为 ItemsPanelTemplate,以及一个 ItemsTemplate,我将 Grid.Row 和 Grid.Column 附加属性绑定到 A.Foo 和 A.Bar,使用 IValueConverters 关联特定的 Foo具有特定的列,例如转换器将在一种 Columns 数组中查找 Foo 值并返回正确的索引。 问题是,为 Grid 构建行和列定义。由于它们是完全动态的(在设计时我不知道 Foo 和 Bar 将在源集合中),我无法在 xaml 文件中定义它们。但在运行时,ItemsControl 确实不提供对当前 ItemsPanel 实例的访问。 我发现的唯一方法是使用 VisualTreeHelper.GetChild 的肮脏方式,我设法获取 ItemsPanel 实例并创建所需的行和列定义,但我的 ItemTemplate-d 项目不会在正确的行和列中呈现,尽管我的转换器返回了正确的列/行索引。也许我真的不明白 ItemsControl 在内部是如何工作的,但问题是,我没有想法。
有人建议将 ListView 与 GridView 一起使用,将相同 Bar 的项目分组到另一个对象中,这将减轻我动态创建行的负担,但动态创建列似乎相当复杂。
有人有想法或至少有提示吗?我错过了什么明显的东西吗?
【问题讨论】:
-
好的,我刚刚发现,ItemsControl 在我的 ItemTemplate 和我的 ItemsPanelTemplate 之间使用了 ContentPresenter...所以我的 ItemTemplate 中附加的 Grid.Row 和 Grid.Column 属性不能工作?我该如何解决这个问题?
-
Foo 和 Bar 有多少个值?您能否使用枚举中的值将属性转换为行/列数?