如何使用WPF显示真实的表格数据?

我有以下问题:我必须在某种网格中显示表格数据。

假设A类是一个数据项,具有属性Foo和Bar,我有一个List列表或者像这样的项目列表。 我想在网格中显示这些项目,其中具有相同Foo的项目在一列中,而具有相同Bar的项目在一行中。 基本。 简单。 我想?

我最初的尝试是创建ItemsControl,使用Grid作为ItemsPanelTemplate,以及ItemsTemplate,其中我将Grid.Row和Grid.Column附加属性绑定到A.Foo和A.Bar,使用IValueConverters将特定Foo与特定Foo相关联列,例如转换器将在一种Columns数组中查找Foo值并返回正确的索引。 问题是,为Grid构建行和列定义。 因为它们是完全动态的(我不知道在设计时,Foo和Bar将在源集合中),我无法在xaml文件中定义它们。 但是在运行时,ItemsControl实际上并不提供对当前ItemsPanel实例的访问。 我找到的唯一方法是使用VisualTreeHelper.GetChild的脏方法,我设法获取ItemsPanel实例并创建所需的Row-和ColumnDefinitions,但我的ItemTemplate-d项目不会在右侧行和列中呈现,虽然我的转换器返回了正确的列/行索引。 也许我真的不明白ItemsControl如何在内部工作,但问题是,我的想法。

有人建议将ListView与GridView一起使用,将同一个Bar的项目分组到另一个对象中,这样可以减轻我动态创建行的负担,但动态创建列似乎相当复杂。

有没有人有想法或至少有一个暗示? 我错过了一些明显的东西吗

好吧,我真的应该在晚上停止工作,新的一天,清醒的头脑,我发现解决方案很快。 基本上,这里已经回答了在ItemsControl DataTemplate中设置Canvas属性 。 我不得不使用ItemContainerStyle为我的渲染项设置Grid.Row和Grid.Column,或者更确切地说是包装ContentPresenter。

因为你提到了切换到ListView的可能性,我认为我建议使用DataGrid,因为一旦你将数据加载到DataTable中,DataGrid就会为你生成所有的工作来生成列和行。

这是我复制的一些工作代码,可以帮助您入门。

这是DataGrid的绑定:

  

在类中定义XAML绑定的属性(我使用MVVM模式):

 private DataTable _dt = new DataTable("MyDataTable"); public DataView GridData { get { return _dt.DefaultView; } } 

将DataColumns添加到DataTable,如下所示:

 DataColumn fileType = new DataColumn("FileType"); fileType.AllowDBNull = true; fileType.DataType = typeof(string); _dt.Columns.Add(fileType); 

将DataRows添加到DataTable,如下所示:

 DataRow dr = _dt.NewRow(); dr["FileType"] = "*.txt"; _dt.Rows.Add(dr); 

重置行和列,如下所示:

 _dt.Rows.Clear(); _dt.Columns.Clear(); 

使用这些部分是我动态生成DataGrid所需的全部内容。