如何在Silverlight中绑定到IEnumerable Dictionary?

时间:2012-01-04 22:56:23

标签: c# silverlight wcf service

背景信息: 我在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中的字段是“Comparer”,“Count”,“Keys”和“Value”。

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

我的问题是双重的

  1. 我使用的代码是否以某种方式错误地创建了字典?
  2. 如果代码正确,如何正确设置DataGrid的数据源,以便显示SQL调用返回的列和行?
  3. 我已尝试绑定到e.Result变量的不同属性,但结果相似。

1 个答案:

答案 0 :(得分:1)

你有两个选择......

  1. 使用DataGrid直接绑定字典,但保持列不自动生成。通过循环遍历总列表的第一项(字典)中的所有键来手动创建列,并使用自定义绑定/转换器显示正确的数据。

  2. 我正在使用teleric GridView,但我认为这也适用于普通的Silverlight数据网格。

    http://blogs.telerik.com/blogs/posts/09-04-23/lightweight-datatable-for-your-silverlight-applications.aspx

  3. 您可以将您的列表转换为客户端的数据表,并轻松使用此方法。

    [更新]第一个选项的代码示例

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