【发布时间】:2016-12-07 20:10:23
【问题描述】:
所以我有一个运行查询并返回 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 列表然后绑定到这些的解决方案。
我需要一些帮助。
谢谢!
【问题讨论】: