我最近遇到了一个问题,希望你们都能提供帮助。
我的任务是创建一个可以接受任何DataSet的应用程序,并将其显示在一系列网格中(使用类似标签控件的东西)。
我能够在WPF中轻松完成这项工作: 1.创建一个返回DataSet对象的WCF服务 2.使用DataGrid创建WPF窗口 3.使用AutoGenerateColumns = True将DataSet的DataTable绑定到WPF DataGrids
现在我被要求在Silverlight中执行此操作。所以从本质上讲,我不知道我回来的表是什么样的,所以我不能创建一个具有可以抛入集合和绑定的属性的类。 Silverlight不允许使用DataSet。
我觉得这对任何平台都是一个相当普遍的需求,有没有办法处理这个问题,而不需要大量的编码来解决这些限制?
答案 0 :(得分:1)
我个人的回答是不使用DataSet(我认为它们非常可怕);而是让你的WCF服务返回业务对象,最好是借助一些ORM框架(实体框架,NHibernate等)来使它更容易。
或者您可以使用Linq to DataSet在通过WCF发送对象之前从DataSet创建对象。
答案 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包含更完整的代码集,可以添加排序和其他高级功能。