如何在 Silverlight 中绑定到 IEnumerable Dictionary
本文关键字:IEnumerable Dictionary 绑定 Silverlight | 更新日期: 2023-09-27 18:19:24
背景信息: 我在 WCF 服务中有以下代码。GetDataTable 基于对传递了查询参数的 SQL 数据库的调用返回 System.Data.DataTable。
public IEnumerable<Dictionary<string, object>> GetData(string *query*) {
var table = GetDataTable(query);
var columns = table.Columns.Cast<DataColumn>();
var dict = table.AsEnumerable()
.Select(r => columns.Select(c => new {
Column = c.ColumnName,
Value = r[c]
})
.ToDictionary(i => i.Column, i => i.Value != DBNull.Value ? i.Value : null));
return dict;
}
我有一个 Silverlight 应用程序,它调用 GetData,传递一个字符串,然后我收到结果。但是,我在 GridView 中的字段是"比较器"、"计数"、"键"和"值"。
Silverlight 代码片段
WCFCLIENT oData = new WCFCLIENT ();
oData.GetData+= new EventHandler<GetDataCompletedEventArgs>(oData_GetData);
oData.GetData(*sqlquery*);
}
}
void oData_GetDataCompleted(object sender, GetDataCompletedEventArgs e) {
if (e.Error == null) {
rdpPaging.Source = e.Result;
rgvDataResults.ItemsSource = rdpPaging.Source;
}
我的问题是双重
的- 我用来创建字典的代码是否以某种方式错误?
- 如果代码正确,如何正确设置 DataGrid 的数据源,使其显示 SQL 调用返回的列和行?
我尝试绑定到 e.Result 变量的不同属性,但结果相似。
您有两个选择...
-
将字典直接与 DataGrid 绑定,但保持列不自动生成。通过循环遍历总列表第一项(字典(中的所有键来手动创建列,并使用自定义绑定/转换器来显示正确的数据。
-
我正在将其与Teleric GridView一起使用,但我认为这也适用于普通的Silverlight数据网格。
http://blogs.telerik.com/blogs/posts/09-04-23/lightweight-datatable-for-your-silverlight-applications.aspx
您可以在客户端将列表转换为数据表,并轻松使用此方法。
[更新] 第一个选项的代码示例
D_Grid.ItemsSource = Data; // Data is the collection of dictionary
foreach (var key in Data[0].Keys)
{
GridViewDataColumn dataCol = null;
dataCol = (GridViewDataColumn)D_Grid.Columns[key];
if (dataCol == null)
{
dataCol = new GridViewDataColumn();
dataCol.Header = key;
dataCol.UniqueName = key;
dataCol.DataMemberBinding = new Binding()
{
Converter =new GridConverter(key); // Put your converter that will take the key and return the value from that key.
};
D_Grid.Columns.Add(dataCol);
}
}
转换器代码。请注意,您需要将密钥存储在构造函数中传递的转换器中。
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is Dictionary<string, object>)
{
var input = (Dictionary<string, object>)value;
if (input.ContainsKey(_key))
return input[_key];
}