`
longgangbai
  • 浏览: 7331375 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Flex中Entity对象与Display对象之间的数据双向动态绑定

阅读更多

 flex项目中对象的和组件的绑定的使用开发:

package controller.utils{
 import com.unutrip.collections.HashMap;
 import com.unutrip.collections.IMap;
 
 import flash.display.DisplayObject;
 import flash.utils.describeType;
 
 import mx.binding.utils.BindingUtils;
 import mx.binding.utils.ChangeWatcher;
 import mx.events.PropertyChangeEvent;
 import mx.utils.ObjectProxy;
 
 /**
  * @Description: BindingHelper
  * @author 白龙岗

  */
 public class BindingHelper{
  /**
   * 目前支持的绑定组件类型
   */  
  private static const typeMap: Object = { 'mx.controls::TextInput' : 'text',
                  'mx.controls::DateField' : 'selectedDate',
                  'mx.controls::ComboBox': 'selectedItem'
                  };  
  /**
   * 存储监控对象的句柄
   * key: entityObj
   * value: ChangeWatcher
   */  
  private static var handleList:IMap = new HashMap();
  
  /** 
         * 对象与组件的数据动态双向绑定 
         * @param entityObj   Entity Object
         * @param displayObj  MX控件
         * @param type          控件类型,如:'mx.controls::TextInput'
         * @exclude     需要排除的property
         * @bidirectional        是否做双向绑定(如果为false,那么只做entity到displayObject的绑定)
         * @param commitOnly
         */ 
  public static function bidirectionalDataBind(
         entityObj:Object,
         displayObj:DisplayObject,
         exclude:Array=null,
         bidirectional:Boolean=true,
         type:String='ALL',         
         commitOnly:Boolean = false):void{
   if(type == 'ALL'){
    for (var typeTmp:String in typeMap){
     bidirectionalDataBind(entityObj,displayObj,exclude,bidirectional,typeTmp,commitOnly);
    }
   }else{
    //通过反射机制取出当前MXML中的信息
    var instanceInfo:XML=flash.utils.describeType(displayObj);
    var properties:XMLList =instanceInfo..accessor.(@type==type);
    var tmpObj:ObjectProxy;
 //   trace(instanceInfo..accessor.(@type==type));
 
    var prop:String = BindingHelper.getSiteProp(type);
 
    for each(var propertyInfo:XML in properties){
     //此处取出的为textinput的id
       var proName:String = propertyInfo.@name;
       
       // 需要排除的property
       if(exclude != null && exclude.indexOf(proName) != -1){
        continue;
       }
       
       // 检查该property是否存在
       if(BeanUtils.checkPropertyExist(entityObj,proName) == false){
        continue;
       }
       
       try{
        // ComboBox
        if(type == 'mx.controls::ComboBox'){
         if(handleList.getValue(entityObj) == null){
          handleList.put(entityObj,new HandleObject(entityObj));
         }
         
       var cw:ChangeWatcher = ChangeWatcher.watch(entityObj,proName,setData);
       HandleObject(handleList.getValue(entityObj)).addChangeWatcher(proName,cw);
       
       BindingUtils.bindProperty(entityObj,proName,DisplayObject(displayObj[proName]),prop,commitOnly);
        }else{
         BindingUtils.bindProperty(DisplayObject(displayObj[proName]),prop,entityObj,proName,commitOnly);
       if(bidirectional == true)
        BindingUtils.bindProperty(entityObj,proName,DisplayObject(displayObj[proName]),prop,commitOnly);
        }
      }catch(err:Error){
        trace(err.message);
       }
    }
   }
  }
  
  /**
   * 清空监控对象的句柄集合
   */  
  public static function clean():void{
   if(handleList != null){
    for each(var ho:Object in handleList.getValues()){
     HandleObject(ho).clean();
    }
    
    handleList.clear();
   }
  }
  
  /**
   * 监听ComboBox事件的变化
   * @param obj
   */
  private static function setData(obj:PropertyChangeEvent):void{
   if(obj.newValue == null){
    return;
   }
   var ho:HandleObject = handleList.getValue(obj.source);   
   var cw:ChangeWatcher = ho.getChangeWatcher(obj.property);
   
   if(obj.newValue is String){
    cw.unwatch();
    cw = ChangeWatcher.watch(obj.source,obj.property,setData);
    ho.addChangeWatcher(obj.property,cw);
    return;
   }else{ 
    var code:Object = obj.newValue.code;
    obj.source[obj.property] = code;
   }
  }
  
  /**
   * 返回组件TYPE对应的需要填充的属性名称
   * @param type
   * @return
   */  
  private static function getSiteProp(type: String): String{
   for (var name:String in typeMap){
    if(name == type){
     return typeMap[name];
    }
   }
   return null;
  }
 }
}

import mx.binding.utils.ChangeWatcher;
 import com.unutrip.collections.HashMap;
 import com.unutrip.collections.IMap;
internal class HandleObject{
  private var entityObject:*;
  private var properityList:IMap;
  
  public function HandleObject(entityObject:*):void{
   this.entityObject = entityObject;
   properityList = new HashMap();
  }
  
  public function addChangeWatcher(propName:Object, cw:ChangeWatcher):void{
   properityList.put(propName,cw);
  }
  
  public function getChangeWatcher(propName:Object):ChangeWatcher{
   return properityList.getValue(propName);
  }
  
  public function clean():void{
   for each(var cw:Object in properityList.getValues()){
    ChangeWatcher(cw).unwatch();
   }
   
   properityList.clear();
  }
 }

 

 

package controller.utils{
 
 import com.adobe.serialization.json.JSON;
 
 import mx.collections.ArrayCollection;
 import mx.utils.ObjectUtil;
 import mx.utils.StringUtil;

 /**
  * @Description: Object Utils
  * @author bailonggang

  */
 public class BeanUtils{  
  /**
   * 检查对象的property是否存在
   * @param obj
   * @param proName
   * @return
   */  
  public static function checkPropertyExist(targetObj:*, proName:String):Boolean{
   if(targetObj as String
     || targetObj as int
     || targetObj as Date
     || targetObj as Number){
    return false;
   }
   
   var objInfo:Object = ObjectUtil.getClassInfo(targetObj);
   for each(var name:String in objInfo.properties){
    if(name == proName){
     return true;
    }
   }
   
   return false;
  }

 

分享到:
评论

相关推荐

    C#使用数据绑定控件录入数据

    在C#编程中,数据绑定是一项关键特性,它允许开发者将UI控件与数据源连接起来,实现数据的动态展示和交互。数据绑定控件在Windows Forms和WPF(Windows Presentation Foundation)等平台上广泛使用,简化了用户界面...

    Visual C#中的数据绑定, 数据绑定根据不同组件可以分为二种

    在Visual C#编程环境中,数据绑定是一项至关重要的技术,它使得应用程序能够动态地与各种数据源进行交互,显示和更新数据。数据绑定可以根据所使用的组件分为两类:简单数据绑定和复杂数据绑定。这两种绑定方式各有...

    DevExpress简单的数据绑定

    数据绑定是.NET框架中的核心概念,允许UI元素与数据源动态关联。在DevExpress GridControl中,数据绑定使你可以将数据集、实体框架模型或其他数据结构映射到控件的行和列,实现数据的实时更新。 2. **数据源选择**...

    ASP.NET中的数据绑定

    `Bind`则支持双向数据绑定,不仅可以读取数据,还可以在用户界面更改时更新数据源。 在进行数据绑定时,需要注意以下几点: 1. 数据源的生命周期管理:确保在适当的时间加载和释放数据源,避免内存泄漏。 2. 数据...

    flex解析json的swc包(entity-flex-v1-02)及例子

    4. **显示数据**:在Flex界面中显示解析出的JSON数据,你可以绑定这些数据到UI组件,如Label、List或其他自定义组件。 5. **事件处理**:在用户交互后,可能需要更新JSON数据并发送回服务器,这时你需要构建新的...

    dataGridView动态绑定数据下拉框

    - 数据绑定:如`DataSource`属性,`DisplayMember`和`ValueMember`设置 - 事件处理:如`CellValueChanged`事件,用于监听下拉框选择的变化 最后,提供的`WindowsFormsApp1`可能是一个示例项目,包含实现上述功能的...

    DevExpress TreeList 数据绑定

    在DevExpress TreeList中,数据绑定是指将数据源(如数据库表、对象集合或XML文件)与TreeList控件关联的过程。这使得TreeList可以自动加载、显示和更新数据源中的信息。数据绑定的基本步骤包括: 1. 创建数据源:...

    DevExpress中GridControl的属性设置及动态绑定数据和全选取消全选

    在本文中,我们将深入探讨如何配置GridControl的属性,实现动态数据绑定,以及添加全选和取消全选的功能。 首先,让我们了解GridControl的一些核心属性: 1. **ReadOnly**:这个属性决定了GridControl是否允许用户...

    asp.net视频数据绑定

    在ASP.NET中,数据绑定是将数据源与用户界面元素(如控件)连接起来的关键技术,使得网页能够动态地显示和更新数据。在这个"ASP.NET视频数据绑定"的主题中,我们将深入探讨数据绑定的概念、类型以及如何在实践中应用...

    WINDOWS FORMS 2.0数据绑定--.NET智能客户端数据应用程序设计(英文pdf)

    数据绑定是.NET框架中的一个强大功能,它允许UI控件与数据源之间建立动态连接,使用户界面能够实时反映数据源的变化。 在Windows Forms 2.0中,数据绑定提供了对多种数据源的支持,包括数据库、XML、数组、集合和...

    Cesium 中 实体类entity多种实例对象-实现点击事件

    本主题将深入探讨如何在Cesium中利用Entity类创建不同的实例对象,并实现点击事件功能,以便与用户进行交互。 首先,让我们了解Cesium中的Entity类。Entity类是Cesium中的一个抽象基类,它提供了用于在3D场景中表示...

    .NET 数据绑定

    .NET数据绑定是微软开发平台中的一个核心特性,主要用于在应用程序的UI层与数据源之间建立动态的连接,使得数据能够实时地反映到用户界面中。在ASP.NET中,数据绑定尤其重要,它使得Web应用程序能够轻松地显示和操作...

    c#数据库数据源绑定

    C#中的数据绑定支持双向绑定,允许用户通过界面修改数据并同步到后台。 2. **数据绑定的步骤**: - 创建数据源:根据具体需求选择合适的数据源,比如使用ADO.NET建立数据库连接,执行SQL查询获取数据。 - 数据...

    ASP.NET演练之“到自定义业务对象的数据绑定”

    在ASP.NET开发中,数据绑定是一项核心功能,它允许开发者将数据源与UI元素关联,以便在用户界面中展示或编辑数据。本演练主要探讨如何将数据绑定到自定义的业务对象,这在构建复杂的Web应用程序时尤为重要。通过...

    asp.net数据绑定

    ASP.NET 数据绑定是微软开发的一种强大的技术,用于在Web应用程序中动态显示和操作数据。它允许开发者将数据源(如数据库、XML文件或对象集合)与用户界面元素(如控件)连接起来,使得数据的更新和展示变得更加简单...

    数据库绑定资源

    例如,ORM(对象关系映射)工具如Hibernate和Entity Framework提供了强大的数据绑定功能,它们自动处理了对象与数据库表之间的映射,使得开发者可以使用面向对象的方式来操作数据库。此外,还有一些轻量级的解决方案...

    控件treeview绑定数据

    在本例中,数据源是一个`List<object>`类型的列表,其中每个对象代表一个实体(Entity)。 3. **递归绑定**: 由于TreeView控件需要按照数据的层级关系创建节点,因此通常采用递归来实现绑定。递归函数会检查当前...

    asp.net 使用数据绑定和DataSet

    在ASP.NET中,数据绑定是一种将数据源(如数据库、XML文件或任何可枚举对象)与UI元素(如控件)关联的方法,使得当数据源发生变化时,UI会自动更新。这种机制简化了开发过程,减少了手动操作DOM的代码量。数据绑定...

    freebase的entity id到真实数据的映射 数据集

    标题中的“entity id到真实数据的映射”指的是Freebase中的每个实体都有一个唯一的标识符,称为mid(Machine ID)。这些mids是Freebase内部用来唯一识别实体的字符串,类似于数据库中的主键。例如,一个表示“艾伦·...

    基于.net的数据绑定模型与创建可绑定的数据网格

    在.NET框架中,数据绑定是将用户界面(UI)组件与数据源连接的关键技术,它使得数据能够自动地反映在用户界面上,并且允许用户对数据进行交互操作。本主题主要探讨的是如何利用.NET的数据绑定模型来创建可绑定的数据...

Global site tag (gtag.js) - Google Analytics