我遇到以下问题: 我必须在某种网格中显示表格数据。
假设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实例并创建所需的Row-和ColumnDefinitions,但我的ItemTemplate-d项目不会在右侧行和列中呈现,虽然我的转换器返回了正确的列/行索引。也许我真的不明白ItemsControl如何在内部工作,但问题是,我的想法。
有人建议将ListView与GridView一起使用,将同一个Bar的项目分组到另一个对象中,这样可以减轻我动态创建行的速度,但动态创建列似乎相当复杂。
有没有人有想法或至少有一个暗示?我错过了一些明显的东西吗
答案 0 :(得分:0)
好吧,我真的应该在晚上停止工作,新的一天,清醒的头脑,我发现解决方案非常快。基本上它已经在这里回答了Setting Canvas properties in an ItemsControl DataTemplate。我不得不使用ItemContainerStyle为我的渲染项设置Grid.Row和Grid.Column,或者更确切地说是包装ContentPresenter。
答案 1 :(得分:0)
因为你提到切换到ListView的可能性我认为我建议使用DataGrid,因为一旦你将数据加载到DataTable中,DataGrid就会为你生成所有的工作来生成列和行。
以下是我复制的一些工作代码,以帮助您入门。
以下是DataGrid的绑定:
<WpfToolkit:DataGrid
IsReadOnly="True"
IsTabStop="False"
ItemsSource="{Binding Path=GridData, Mode=OneWay}">
</WpfToolkit: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所需的全部内容。