`
michaelx4
  • 浏览: 3797 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Silverlight 动态创建类并绑定DataGrid Column及ItemSource

阅读更多

        使用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通常通过数据绑定机制来动态地显示来自各种数据源的数据,如集合、列表或数据库查询结果等。 在这个"Silverlight DataGrid数据绑定小实例"中,我们关注的是如何将一个list对象绑定到...

    silverlight datagrid动态绑定dictionary 列表

    总结,Silverlight中的DataGrid动态绑定Dictionary列表涉及到动态列创建、数据绑定、转换器的使用以及事件处理。通过合理利用这些技术,我们可以创建出灵活且适应性强的数据展示界面。在实际项目中,可以根据具体...

    Silverlight4连接sql2005查询绑定datagrid

    在本文中,我们将深入探讨如何使用Silverlight 4与SQL Server 2005进行交互,特别是关于查询数据并将其绑定到datagrid控件的过程。Silverlight是微软开发的一个富互联网应用程序(RIA)框架,用于创建具有丰富媒体和...

    siverlight中根据XML模板生成动态类绑定到DataGrid源码例子

    总结来说,这个示例展示了如何在Silverlight中利用XML定义数据模型,动态生成类,然后将这些类绑定到DataGrid以实现数据的动态展示。这涉及到XML解析、动态代码生成、数据绑定和UI设计等多个重要知识点,对于理解和...

    动态定义silverlight DataGrid Columns(ComboBox)源代码

    本篇文章将深入探讨如何在Silverlight中实现动态地为DataGrid的某一列添加ComboBox控件,并提供相关的源代码示例。 首先,我们要理解Silverlight中的DataGrid控件和ComboBox控件的基本用法。DataGrid通常通过绑定到...

    silverlight使用主从表信息显示datagrid

    3. **数据绑定**:在Silverlight中,数据绑定是核心特性,用于将UI元素(如DataGrid)与业务逻辑中的数据连接起来。主表和从表的数据都需要绑定到DataGrid的不同部分。 4. **查询与加载数据**:使用WCF RIA ...

    Silverlight中给DataGrid赋值

    利用ItemsSource属性,我们可以将数据源绑定到DataGrid,实现动态的数据展示。同时,通过自定义列和事件处理,可以实现更丰富的用户体验。在实际开发中,结合MVVM模式,DataGrid能更好地发挥其作用,提供强大而灵活...

    wpf中DataGrid数据双向绑定

    3. **定义DataGrid**:在XAML中,创建DataGrid并设置其ItemsSource属性,这通常是一个ObservableCollection,它允许在集合中的项添加、删除或更改时通知视图。 ```xml &lt;DataGrid ItemsSource="{Binding Customers}...

    silverlight自定义DataGrid demo

    1. 数据绑定:使用Silverlight的Binding类将数据模型与UI元素关联,使数据的更改能反映到界面。 2. 动态添加行:当数据集合发生变化时,需要动态地在Grid中添加或删除行。 3. 编辑和验证:为每个单元格添加编辑功能...

    silverlight DataGrid 行内添加明细行明细表

    在本文中,我们将深入探讨如何在Silverlight中的DataGrid控件中实现行内添加明细行以及如何进行单元格合并,以此来创建一个功能丰富的数据展示界面。Silverlight是一款由Microsoft开发的富客户端技术,用于构建具有...

    简单的DataGrid绑定

    总之,简单的DataGrid绑定是WPF开发的基础,通过这个过程,你可以理解数据绑定的概念,并掌握如何在C#和XAML中实现它。随着对DataGrid更深入的理解,你将能够构建功能更丰富的数据驱动的应用程序。

    WPF DataGrid ComboBox下拉框数据绑定 代码实例

    总结来说,这个项目展示了如何在WPF中使用DataGrid结合ComboBox实现数据绑定,通过C#代码和XAML结合,动态地加载和显示数据,以及处理用户的选择操作。这在开发复杂的业务应用时非常常见,帮助用户在表格中选择和...

    WPF之DataGrid动态生成列实例

    3. **动态生成列**:在代码-behind或单独的视图助手类中,遍历ViewModel的属性,为每个属性创建一个DataGridColumn,并设置其Header(列头)和Binding(数据绑定)。这通常在DataGrid的Loaded事件中完成,确保在...

    silverlight Datagrid 样式

    Silverlight DataGrid提供了丰富的功能,如数据绑定、排序、分组、筛选、编辑、行选择等。它支持多种数据源,包括集合、ObservableCollection和数据服务。默认样式虽然实用,但可能无法满足所有设计需求,因此了解...

    WPF下DataGrid每行设置不同的ComboBox的数据绑定

    2. 创建数据源:填充一个ObservableCollection,并将其设置为DataGrid的ItemsSource。 ```csharp ObservableCollection&lt;MyDataItem&gt; items = new ObservableCollection(); // 填充数据... dataGrid.ItemsSource = ...

    silverlight导出DataGrid数据实例

    在本文中,我们将深入探讨如何在Silverlight应用中实现DataGrid数据的导出功能,以创建实例化的Excel文件。 Silverlight是一种由微软开发的富互联网应用程序(RIA)平台,它允许开发者创建交互式、多媒体丰富的Web...

    WPF绑定Datagrid与Textbox等,包括自动通知UI更新显示

    总之,WPF的数据绑定功能提供了强大的工具,使得开发人员可以轻松地创建动态且响应式的用户界面。通过理解并熟练运用这些技术,我们可以构建出更加直观、易用的应用程序,同时减少手动同步数据和视图的工作。

    动态创建类型对象用于界面数据绑定(基于Silverlight)

    最后,调用`TypeBuilder`的`CreateType`方法创建实际的类型实例,然后可以使用这个动态生成的类创建对象列表,将其绑定到`DataGrid`,从而实现动态数据的展示。 总结来说,动态创建类型对象是应对Silverlight中数据...

    DataGrid绑定控件示例

    在“DataGrid绑定控件示例”中,我们可能看到如何设置和配置DataGrid控件,以便它能够动态地从数据源获取数据并显示出来。 首先,我们需要理解数据绑定的基本概念。数据绑定是.NET Framework中的一个核心特性,它...

    WPF实现DataGrid嵌入ComBox绑定

    数据绑定允许UI元素(如ComboBox和DataGrid)与应用程序中的数据源进行连接,使UI动态反映数据的变化。在.NET6中,我们可以使用MVVM(Model-View-ViewModel)设计模式,将业务逻辑和UI分离,提高代码的可维护性。 1...

Global site tag (gtag.js) - Google Analytics