2016-12-07 124 views
0

因此,我有一個運行查詢並返回JSON響應的api調用。由於JSON響應的結構,我創建了一個可以使用Json.Net反序列化返回的類。下面是示例類:將數據網格綁定到具有嵌套類的對象

public class QuerySet 
{ 
    public List<Column> Columns { get; set; } 
    public class Column 
    { 
     public List<string> Name { get; set; } 
    } 
    public List<RowSet> Rows { get; set; } 
    public class RowSet 
    { 
     public List<DataSet> Row { get; set; } 
     public class DataSet 
     { 
      public List<string> Data { get; set; } 
     } 
    } 
} 

現在,一個API調用可以包含多個查詢集,所以對於每一個回報,我生成的查詢集列表,我再想數據的DataGrid綁定到每組。這裏是什麼,我至今在我的窗口後面的代碼示例:

public List<DataGrid> QueryResults; 

    public QueryResultsWindow(string _name, JObject _returns) 
    { 
     InitializeComponent(); 
     QueryNameText.Text = _name; 
     QueryResults = new List<DataGrid>(); 

     JArray sets = (JArray)_returns.SelectToken("$..Set"); 

     foreach(JObject set in sets) 
     { 
      DataGrid dg = new DataGrid(); 
      QuerySet s = new QuerySet(); 
      s = JsonConvert.DeserializeObject<QuerySet>(set.ToString()); 

      dg.ItemsSource = s.Rows; 

      QueryResults.Add(dg); 
     } 

     ResultsListBox.ItemsSource = QueryResults; 
    } 

在這裏,你可能會看到的問題是,對於每一個特定的DataGrid,我想綁定到Name屬性列標題,並從Data屬性填充的數據。

這裏是我目前在該窗口中的XAML設置:

<DockPanel> 
     <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" VerticalAlignment="Top"> 
      <TextBlock x:Name="QueryNameText" Margin="5"></TextBlock> 
      <Button Content="Export Results" Click="Button_Click" Margin="5"></Button> 
     </StackPanel> 
     <ListBox DockPanel.Dock="Top" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="3" Name="ResultsListBox"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding UpdateSourceTrigger=PropertyChanged}" CanUserAddRows="False" IsReadOnly="True" SelectionUnit="Cell"> 
         <DataGrid.Columns> 
          <DataGridTextColumn Header="{Binding Name}"></DataGridTextColumn> 
         </DataGrid.Columns> 
        </DataGrid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </DockPanel> 

我知道,如果我想爲每個可能的返回類型的自定義類,這將容易得多。但是,考慮到數百種潛在的回報類型,這似乎不太可行。我試過使用DataTables,我試着在XAML的ListBox中設置DataGrid,但是我可能沒有正確實現它,最後來到試圖創建DataGrids列表然後綁定到這些列表的解決方案。

我可以使用一些幫助。

謝謝!

回答

1

因此,這一切搞砸了。這是我提出的答案。

我把查詢集類以上,並增加了一個方法來構建查詢集類中的數據表:

public class QuerySet 
    { 
     public DataTable BindableTable { get; private set; } 
     public static List<string> ColumnName { get; private set; } 
     public static List<RowSet.DataSet> RowsSet { get; private set; } 

     public List<Column> Columns { get; set; } 
     public class Column 
     { 
      private List<string> _name; 

      public List<string> Name 
      { 
       get { return _name; } 
       set { _name = value; ColumnName = _name; } 
      } 


     } 
     public List<RowSet> Rows { get; set; } 

     public class RowSet 
     { 
      private List<DataSet> _row; 

      public List<DataSet> Row 
      { 
       get { return _row; } 
       set { _row = value; RowsSet = _row; } 
      } 

      public class DataSet 
      { 
       public List<string> Data { get; set; } 
      } 
     } 

     public void GetDataGridTable() 
     { 
      DataTable table = new DataTable(); 
      foreach(string name in ColumnName) 
      { 
       table.Columns.Add(name); 
      } 
      foreach(RowSet.DataSet set in RowsSet) 
      { 
       DataRow row = table.NewRow(); 
       int counter = 0; 
       foreach(string item in set.Data) 
       { 
        row[counter] = item; 
        counter++; 
       } 
       table.Rows.Add(row); 
      } 

      BindableTable = table; 
     } 
    } 

我增加了幾個存取,使得到的嵌套位更容易,並建立一個DataTable從那裏。在我的彈出窗口的後面我的代碼,我創建DataGrid中的一個觀察的集合,並設置每個網格的DataContext的基於該查詢集一個DataView:

public ObservableCollection<DataGrid> QueryResults; 
    public event PropertyChangedEventHandler PropertyChanged; 

    public QueryResultsWindow(string _name, JObject _returns) 
    { 
     InitializeComponent(); 
     QueryNameText.Text = _name; 
     QueryResults = new ObservableCollection<DataGrid>(); 

     JArray sets = (JArray)_returns.SelectToken("$..Set"); 

     foreach(JObject set in sets) 
     { 
      DataGrid dg = new DataGrid(); 
      QuerySet s = new QuerySet(); 
      s = JsonConvert.DeserializeObject<QuerySet>(set.ToString()); 

      s.GetDataGridTable(); 
      DataView newView = new DataView(s.BindableTable); 
      dg.ItemsSource = newView; 
      dg.CanUserAddRows = false; 
      dg.CanUserDeleteRows = false; 
      QueryResults.Add(dg); 
     } 

     ResultsListBox.ItemsSource = QueryResults; 
    } 

然後我的彈出式窗口中的XAML是非常簡單的:

<DockPanel> 
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" VerticalAlignment="Top"> 
     <TextBlock x:Name="QueryNameText" Margin="5"></TextBlock> 
     <Button Content="Export Results" Click="Button_Click" Margin="5"></Button> 
    </StackPanel> 
    <ListBox DockPanel.Dock="Top" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="3" Name="ResultsListBox" ItemsSource="{Binding QueryResults}"> 
    </ListBox> 
</DockPanel> 

顯然這不是最優雅的解決方案。即使只是在這裏查看它,我可以輕鬆地在QuerySet類中創建DataView,而不是在後面的代碼中進行轉換。所以,雖然答案並不完美,但它現在還在工作。