使用Silverlight开发前台页面,需要将后台查询回的集合绑定到前台的DataGrid上。
一般情况下,我们都有定义好的实体类Po,然后可以.xaml文件中固定绑定Po的成员变量到DataGrid的列上,当取到实体集合时直接将 dataGrid.itemsource = List<Po> 即可。
但有些时候,我们并不知道返回的集合中的实体是什么类型,无法预先定义PO,那么该如何动态绑定列和集合呢?
想到一个方法就是在拿到集合后通过反射动态的创建PO类,动态添加public属性,并动态绑定到DataGrid Column。然后再绑定实体集合就可实现需求。
首先在工程中添加动态类型工厂类 DynamicTypeBuilder:
public class DynamicTypeBuilder { TypeBuilder tb; /// <summary> /// 构造函数 /// </summary> /// <param name="typeNm">动态类型的名称</param> public DynamicTypeBuilder(string typeNm) { // 在 Silverlight 中 AssemblyBuilderAccess 没有 RunAndSave AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly( new AssemblyName("TempAssembly"), AssemblyBuilderAccess.Run); ModuleBuilder mb = ab.DefineDynamicModule("TempModule"); this.tb = mb.DefineType(typeNm, TypeAttributes.Public); } /// <summary> /// 添加一个public的可读写属性,并且会创建对应的名为 propertyNm + "Field" 的私有字段 /// </summary> /// <param name="propertyNm"></param> /// <param name="type"></param> public void AppendPublicProperty(string propertyNm, Type type) { this.AppendPublicProperty(propertyNm, type, true, true); } /// <summary> /// 添加一个public属性,并且会创建对应的名为 propertyNm + "Field" 的私有字段 /// </summary> /// <param name="propertyNm"></param> /// <param name="type"></param> /// <param name="canGet">是否实现getter</param> /// <param name="canSet">是否实现setter</param> public void AppendPublicProperty(string propertyNm, Type type, bool canGet, bool canSet) { FieldBuilder field = this.tb.DefineField(string.Format("{0}Field", propertyNm), type, FieldAttributes.Private); PropertyBuilder property = tb.DefineProperty(propertyNm, PropertyAttributes.HasDefault, type, null); MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig; if (canGet) { MethodBuilder getAccessor = tb.DefineMethod(string.Format("get_{0}", propertyNm), getSetAttr, type, Type.EmptyTypes); ILGenerator getIL = getAccessor.GetILGenerator(); // For an instance property, argument default is the instance. Load the // instance, then load the private field and return, leaving the // field value on the stack. getIL.Emit(OpCodes.Ldarg_0); getIL.Emit(OpCodes.Ldfld, field); getIL.Emit(OpCodes.Ret); property.SetGetMethod(getAccessor); } if (canSet) { MethodBuilder setAccessor = tb.DefineMethod(string.Format("set_{0}", propertyNm), getSetAttr, null, new Type[] { type }); setAccessor.DefineParameter(1, ParameterAttributes.None, "value"); ILGenerator setIL = setAccessor.GetILGenerator(); // Load the instance and then the numeric argument, then store the // argument in the field. setIL.Emit(OpCodes.Ldarg_0); setIL.Emit(OpCodes.Ldarg_1); setIL.Emit(OpCodes.Stfld, field); setIL.Emit(OpCodes.Ret); property.SetSetMethod(setAccessor); } } /// <summary> /// 在添加完各个 public 属性之后,调用此方法以完成对动态类型的定义并加载之, /// 此后通过 Activator.CreateInstance() 便可实例化动态类型 /// </summary> /// <returns></returns> public Type CreateDynamicType() { return this.tb.CreateType(); } }
有了它我们就可以动态创建类了。
DynamicTypeBuilder dyClass = new DynamicTypeBuilder("dy");//创建动态类,dy可以随便替换 datagrid.Columns.Clear();//清空datagrid的已有列 ....... //ColInfos为已经取到的列信息集合 foreach (ColInfo colInfo in colInfos) { String name = colInfo.name;//列绑定名 String title = colInfo.title;//列显示名 DataGridTextColumn dtc = new DataGridTextColumn();//动态创建列,完成绑定 dtc.Header = name; dtc.Binding = new Binding("_" + name); this.datagrid.Columns.Add(dtc);//添加列 dyClass.AppendPublicProperty("_" + name, typeof(string));//同时动态添加公共属性到自定义类 } Type dyType = dyClass.CreateDynamicType();//创建自定义类 ........ //构造绑定DataGrid ItemSource的集合 List<Object> datas = new List<Object>(); var po = Activator.CreateInstance(dyType);//创建自定义类实例 PropertyInfo property = dyType.GetProperty("_" + colInfos[i].name); property.SetValue(po, [value], null); datas.add(po); dataGrid.itemsource = datas }
相关推荐
在Silverlight中,DataGrid通常通过数据绑定机制来动态地显示来自各种数据源的数据,如集合、列表或数据库查询结果等。 在这个"Silverlight DataGrid数据绑定小实例"中,我们关注的是如何将一个list对象绑定到...
总结,Silverlight中的DataGrid动态绑定Dictionary列表涉及到动态列创建、数据绑定、转换器的使用以及事件处理。通过合理利用这些技术,我们可以创建出灵活且适应性强的数据展示界面。在实际项目中,可以根据具体...
在本文中,我们将深入探讨如何使用Silverlight 4与SQL Server 2005进行交互,特别是关于查询数据并将其绑定到datagrid控件的过程。Silverlight是微软开发的一个富互联网应用程序(RIA)框架,用于创建具有丰富媒体和...
总结来说,这个示例展示了如何在Silverlight中利用XML定义数据模型,动态生成类,然后将这些类绑定到DataGrid以实现数据的动态展示。这涉及到XML解析、动态代码生成、数据绑定和UI设计等多个重要知识点,对于理解和...
本篇文章将深入探讨如何在Silverlight中实现动态地为DataGrid的某一列添加ComboBox控件,并提供相关的源代码示例。 首先,我们要理解Silverlight中的DataGrid控件和ComboBox控件的基本用法。DataGrid通常通过绑定到...
3. **数据绑定**:在Silverlight中,数据绑定是核心特性,用于将UI元素(如DataGrid)与业务逻辑中的数据连接起来。主表和从表的数据都需要绑定到DataGrid的不同部分。 4. **查询与加载数据**:使用WCF RIA ...
利用ItemsSource属性,我们可以将数据源绑定到DataGrid,实现动态的数据展示。同时,通过自定义列和事件处理,可以实现更丰富的用户体验。在实际开发中,结合MVVM模式,DataGrid能更好地发挥其作用,提供强大而灵活...
3. **定义DataGrid**:在XAML中,创建DataGrid并设置其ItemsSource属性,这通常是一个ObservableCollection,它允许在集合中的项添加、删除或更改时通知视图。 ```xml <DataGrid ItemsSource="{Binding Customers}...
1. 数据绑定:使用Silverlight的Binding类将数据模型与UI元素关联,使数据的更改能反映到界面。 2. 动态添加行:当数据集合发生变化时,需要动态地在Grid中添加或删除行。 3. 编辑和验证:为每个单元格添加编辑功能...
在本文中,我们将深入探讨如何在Silverlight中的DataGrid控件中实现行内添加明细行以及如何进行单元格合并,以此来创建一个功能丰富的数据展示界面。Silverlight是一款由Microsoft开发的富客户端技术,用于构建具有...
总之,简单的DataGrid绑定是WPF开发的基础,通过这个过程,你可以理解数据绑定的概念,并掌握如何在C#和XAML中实现它。随着对DataGrid更深入的理解,你将能够构建功能更丰富的数据驱动的应用程序。
总结来说,这个项目展示了如何在WPF中使用DataGrid结合ComboBox实现数据绑定,通过C#代码和XAML结合,动态地加载和显示数据,以及处理用户的选择操作。这在开发复杂的业务应用时非常常见,帮助用户在表格中选择和...
3. **动态生成列**:在代码-behind或单独的视图助手类中,遍历ViewModel的属性,为每个属性创建一个DataGridColumn,并设置其Header(列头)和Binding(数据绑定)。这通常在DataGrid的Loaded事件中完成,确保在...
Silverlight DataGrid提供了丰富的功能,如数据绑定、排序、分组、筛选、编辑、行选择等。它支持多种数据源,包括集合、ObservableCollection和数据服务。默认样式虽然实用,但可能无法满足所有设计需求,因此了解...
2. 创建数据源:填充一个ObservableCollection,并将其设置为DataGrid的ItemsSource。 ```csharp ObservableCollection<MyDataItem> items = new ObservableCollection(); // 填充数据... dataGrid.ItemsSource = ...
在本文中,我们将深入探讨如何在Silverlight应用中实现DataGrid数据的导出功能,以创建实例化的Excel文件。 Silverlight是一种由微软开发的富互联网应用程序(RIA)平台,它允许开发者创建交互式、多媒体丰富的Web...
总之,WPF的数据绑定功能提供了强大的工具,使得开发人员可以轻松地创建动态且响应式的用户界面。通过理解并熟练运用这些技术,我们可以构建出更加直观、易用的应用程序,同时减少手动同步数据和视图的工作。
最后,调用`TypeBuilder`的`CreateType`方法创建实际的类型实例,然后可以使用这个动态生成的类创建对象列表,将其绑定到`DataGrid`,从而实现动态数据的展示。 总结来说,动态创建类型对象是应对Silverlight中数据...
在“DataGrid绑定控件示例”中,我们可能看到如何设置和配置DataGrid控件,以便它能够动态地从数据源获取数据并显示出来。 首先,我们需要理解数据绑定的基本概念。数据绑定是.NET Framework中的一个核心特性,它...
数据绑定允许UI元素(如ComboBox和DataGrid)与应用程序中的数据源进行连接,使UI动态反映数据的变化。在.NET6中,我们可以使用MVVM(Model-View-ViewModel)设计模式,将业务逻辑和UI分离,提高代码的可维护性。 1...