2010-08-25 93 views
0

我有以下问题: 我必须在某种网格中显示表格数据。如何使用WPF显示真正的表格数据?

说A类是一个数据项目,属性Foo和酒吧,我有一个列表项目列表或这样的事情。我想在网格中显示这些项目,其中具有相同Foo的项目位于一列中,并且具有相同Bar的项目位于一行中。基本。简单。我想?

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

有人建议将ListView与GridView一起使用,将我的条目在另一个对象中分组,这将使我无法动态创建行,但动态创建列看起来相当复杂。

有没有人有想法或至少有提示?我错过了什么明显的东西?

+0

好的我刚刚发现,ItemsControl在我的ItemTemplate和我的ItemsPanelTemplate之间使用ContentPresenter ...所以我的ItemTemplate中附加的Grid.Row和Grid.Column属性无法工作?我如何解决这个问题? – Cice 2010-08-25 14:29:45

+0

Foo和Bar有多少个值?你可以在枚举中使用值来将属性转换为行/列号吗? – CodeWarrior 2010-08-25 14:40:35

回答

0

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

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添加到您的数据表如下所示:

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(); 

使用这些部件是所有我需要动态生成一个数据网格。

+1

请注意,DataGrid是.Net 3.5的WpfToolkit的一部分,但已迁移基础.Net Framework 4.0版。 – 2010-08-26 18:13:26