2016-12-07 10 views
0

私はクエリを実行し、JSON応答を返すAPIコールがあります。 JSONレスポンスの構造のため、私はJson.Netを使用してリターンを逆シリアル化するクラスを作成しました。ここでは例のクラスがある:データネストされたクラスを持つオブジェクトにDataGridをバインド

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コールは、いくつかのクエリセットを含むことができ、それぞれのリターンのために、私は、その後のデータにしたいことを、クエリセットのリストを生成するように、各セットにデータグリッドをバインド。あなたが見るかもしれないような問題は、ここで

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プロパティにバインドされた列ヘッダーをしたいということです、そして:ここに私は私の窓の背後にあるコードでは、これまで持っているものの一例ですデータプロパティからデータが読み込まれます。ここで

は、私は現在のウィンドウで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> 

私はそれぞれの可能な戻り値の型のカスタムクラスを作成したい場合、これはずっと容易になるだろうことを知っています。しかし、何百もの潜在的な戻り値の型を考えると、これはあまり実行可能ではないようです。 DataTableを使用しようとしましたが、XAMLのListBoxでDataGridを設定しようとしましたが、これが正しく実装されていない可能性があります。最後に、DataGridのリストを作成してそれらにバインドしようとしました。

私はいくつかの助けを使うことができます。

ありがとうございます!

答えて

1

だからこそ、このことに悩まされています。ここに私が思いついた答えがあります。

私は、上記のクエリセットのクラスを取って、クエリセットクラス内のDataTableを構築するための方法を追加しました:

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; 
     } 
    } 

私は簡単にネストされたビットになって作るためにアクセサのカップルを追加し、データテーブルを構築しましたそこから。私のポップアップウィンドウの後ろに私のコードでは、私は、データグリッドの監視可能なコレクションを作成し、クエリセットに基づいてデータビューに各グリッドのDataContextの設定:

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を簡単に作成できます。答えは完璧ではありませんが、今のところはうまくいきます。

関連する問題