2010-08-25 90 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