2012-06-14 49 views
2

我有一大組數據是從我的程序中的Web服務生成的。我需要在DataGrid中顯示這些數據,但返回的數據集合都有不同的格式(一個可能是3列,接下來的7個),所以我不能創建一個特定的對象來保存這些數據。我無法顯示此信息。現在我正在嘗試使用這種方法。我將數據放入KeyValuePairs的二維列表中。鍵是這個數據將屬於的列,該值是該行的輸出。這是我現在正在嘗試的。DataGridColumn使用動態生成的數據進行綁定

private void SetDataValuesExecute(List<List<KeyValuePair<string,object>>> Data) 
    { 
     ResultsCollection = Data; 
     ValuesDataGrid.Columns.Clear(); 
     foreach (string colName in Data[0].Select(x => x.Key).ToList()) 
     { 
      DataGridTextColumn tempCol = new DataGridTextColumn(); 
      tempCol.Header = colName; 
      Binding bind = new Binding(); 
      bind.Source = ResultsCollection.Select(x => x.FirstOrDefault(y => y.Key == colName).Value.ToString()).ToList(); 
      tempCol.Binding = bind; 
      ValuesDataGrid.Columns.Add(tempCol);   
     } 
    } 

ResultsCollection是一個非易失性變量,可用作我的綁定的源。它是我需要構建DataGrid的所有二維列表數據的副本。

這看起來第一個條目提取列標題值,並基於它創建新的列。綁定語句查看每一行,爲指定的列抓取數據,並嘗試將其設置爲列的綁定。這使我可以同時擁有列名和列中所有數據的列表。不幸的是,將數據列表綁定到列最終不會顯示任何數據。

所以我的問題是:我如何需要格式化我的數據,以便列綁定實際顯示數據?我接近這種情況都錯了嗎?任何幫助表示讚賞,因爲我很難過。

+0

如果你只傳遞一行它是否工作?很確定它正在變得比第一個列更少,拋出和超出範圍異常。我認爲你將需要迭代通過行來找到最大列數,然後將每行填充到最大數量。 – Paparazzi

+0

@Blam每個單獨的一組數據的所有行具有完全相同的字段(相同的列數)。我得到一組新的數據以更改列號,當發生這種情況時,我將清除DataGrid並將其替換爲新數據。 – Nerzugal

回答

3

下面是一個完整的工作樣本

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var data = new MyViewModel(); 

     int columnIndex = 0; 

     foreach (var name in data.ColumnNames) 
     { 
      grid.Columns.Add(
       new DataGridTextColumn 
       { 
        Header = name, 
        Binding = new Binding(
         string.Format("Values[{0}]", columnIndex++)) 
       }); 
     } 

     DataContext = data; 
    } 
} 

public class MyViewModel 
{ 
    public MyViewModel() 
    { 
     Items = new List<RowDataItem> 
      { 
       new RowDataItem(), 
       new RowDataItem(), 
       new RowDataItem(), 
      }; 

     ColumnNames = new List<string>{ "Col 1", "Col 2", "Col 3"}; 
    } 

    public IList<string> ColumnNames { get; private set; } 

    public IList<RowDataItem> Items { get; private set; } 
} 

public class RowDataItem 
{ 
    public RowDataItem() 
    { 
     Values = new List<string>{ "One", "Two", "Three"};  
    } 

    public IList<string> Values { get; private set; } 
} 

XAML中

<Grid> 
    <DataGrid x:Name="grid" ItemsSource="{Binding Items}" 
       AutoGenerateColumns="False"/> 
</Grid> 
+0

我試圖設置它,但它仍然沒有顯示任何數據。爲了澄清,我將DataValuesGrid的DataContext設置爲Items列表。這應該公開通過我的綁定添加了'Binding = new Binding(string.Format(「Values [{0}]」,columnIndex ++))的每個「Values」包含一個表示數據的字符串列表每列(列索引匹配行中的項目索引)。列標題當然顯示正常,但列本身似乎沒有從列中獲取任何數據。我是否需要改變我的約束力? – Nerzugal

+0

@ user1456624:已更新,希望它有幫助。 – Phil

+0

(更新了我的用戶名)即使在ItemsSource更改後仍然無法正常工作。項目的結構就像這樣=> Items [index] .Values [index]其中包含我想要輸出的值的字符串表示形式。所以物料的索引會將您帶到每個RowDataItem,並使用值中的索引讓您訪問每個單獨的值。這是正確的,對嗎? ItemsSource = Items,DataContext是我的ViewModel,Binding應該是列1的值[0]和列2的值[1]等等。我覺得所有事情都是正確的,但沒有運氣。感謝所有的幫助。 – Nerzugal

相關問題