Silverlight:将动态数据绑定到DataGrid

时间:2010-09-17 15:30:24

标签: silverlight dynamic datagrid binding dataset

我最近遇到了一个问题,希望你们都能提供帮助。

我的任务是创建一个可以接受任何DataSet的应用程序,并将其显示在一系列网格中(使用类似标签控件的东西)。

我能够在WPF中轻松完成这项工作: 1.创建一个返回DataSet对象的WCF服务 2.使用DataGrid创建WPF窗口 3.使用AutoGenerateColumns = True将DataSet的DataTable绑定到WPF DataGrids

现在我被要求在Silverlight中执行此操作。所以从本质上讲,我不知道我回来的表是什么样的,所以我不能创建一个具有可以抛入集合和绑定的属性的类。 Silverlight不允许使用DataSet。

我觉得这对任何平台都是一个相当普遍的需求,有没有办法处理这个问题,而不需要大量的编码来解决这些限制?

3 个答案:

答案 0 :(得分:1)

我个人的回答是不使用DataSet(我认为它们非常可怕);而是让你的WCF服务返回业务对象,最好是借助一些ORM框架(实体框架,NHibernate等)来使它更容易。

或者您可以使用Linq to DataSet在通过WCF发送对象之前从DataSet创建对象。

另请参阅these threads了解详情。

答案 1 :(得分:1)

一种解决方案是将DataSet列信息和DataSet XML传递给silverlight。在Silverlight端,基于具有System.Reflection.Emit命名空间提供的功能的数据构建动态数据对象。然后将动态构建DataObject的List绑定到DataGrid。动态数据对象将为DataSet中的每个列提供一个属性,具有相同的DataType。

因为我们除了Data之外还有Column Information,所以绑定到DataGrid可以非常灵活。您可以设置AutoGeneratedColumn = true,以便显示DataSet中的所有数据,或者我可以动态生成我想要显示的列。

您可以从 here

下载示例源代码

答案 2 :(得分:1)

This tutorial建议一种看起来比发出动态类简单得多的方法。您基本上利用Converter属性绑定到数据行上的索引值。

我刚尝试过这种方法,看起来效果很好。这是一些代码:

/// <summary>
/// Allows us to bind columns to dictionary entries.
/// </summary>
public class DictionaryConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var dict = (IDictionary) value;
        return dict[parameter];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

用法:

List<IDictionary<string, object>> dicts = GetDictionaryData();
foreach (var series in _trendChart.Series)
{
    _dataGrid.Columns.Add(
        new DataGridTextColumn{
            Header = series.Name, 
            Binding = new Binding{
                Converter = new DictionaryConverter(), 
                ConverterParameter = series.Name
            }
        });
}
_dataGrid.ItemsSource = dicts;

更新

This article包含更完整的代码集,可以添加排序和其他高级功能。