自定义ClassFactory,让DataGrid动态改变Button或Image等属性II

上一期提到Flex3 自定义ClassFactory,让DataGrid动态改变Button或Image等属性。但后来发现,里面的icon都是预先定义好的才可以。如果是用户后来上传的图片,该怎么把这些图片动态运用到按钮上去?前面是用Embed绑定到一个Class上,但是这种代码我无法用AS动态写出来,比如讲Embed里面的source的值用一个变量来表示。后来同事提供了一个链接给我: http://blog.benstucki.net/?p=42,Ben Stucki 写了一个类IconUtility,里面有个static方法getClass返回了一个Class。有了它在运行时动态加载一个图片,换了原来按钮的图片是没有问题的!牛人啊,不愧是Flex Consultant!但是如果直接搬到我原来的代码里,是行不通的。原代码如下:
dgc = new DataGridColumn();      
      dgc.dataField = oColumnDef.id.datafield;         
     
      //MyButton 是自定义组件,在其中添加了一些事件
      var cf:ClassFactory=new MyClassFactory(MyButton,{label:"ok"},{icon:add});         
      dgc.itemRenderer=cf;                      
      }    
这里的add是一个已经绑定了图片的Class,用上牛人的方法要改写成如下:

dgc = new DataGridColumn();      
      dgc.dataField = oColumnDef.id.datafield;         
     
      //MyButton 是自定义组件,在其中添加了一些事件
      var cf:ClassFactory=new CMSClassFactory(MyButton,{label:"ok"},{icon:IconUtility.getClass( MyButton的实例, 'http://www.exampledomain.com/image.jp});         
      dgc.itemRenderer=cf;                      
      }   


问题出现了,这里如何得到MyButton的实例,我试了 new MyClassFactory(MyButton).newInstance(),无效。我后来又改写了我的MyClassFactory类

package com.yonghong.model
{
import mx.core.ClassFactory;

public class MyClassFactory extends ClassFactory
{
                  //styleCollection represents a collection of style
                  //properties represents a collection of property
private var styleCollection:Object;
public function CMSClassFactory(generator:Class=null,properties:Object=null,styleCollection:Object=null)
{
super(generator);
this.properties=properties;
this.styleCollection=styleCollection;

}

public override  function newInstance():*
    {
        var instance:Object = new generator();

        if (properties != null)
        {
            for (var p:String in properties)
            {
                instance[p] = properties[p];
            }
        }
        if(styleCollection != null){
        for(var s:String in styleCollection){
        if(s=="icon")
          instance.setStyle(s,IconUtility.getClass(instance as UIComponent,styleCollection[s]));
        else
          instance.setStyle(s,styleCollection[s]);
        }
        }

        return instance;
    }

下面是新的使用代码:
dgc = new DataGridColumn();      
      dgc.dataField = oColumnDef.id.datafield;         
     
      //MyButton 是自定义组件,在其中添加了一些事件
      var cf:ClassFactory=new CMSClassFactory(MyButton,{label:"ok"},{icon:"http://www.exampledomain.com/image.jp"});         
      dgc.itemRenderer=cf;                      
      }   

以上说出我的思路而已,某些代码还有待改善。希望可以帮到一些朋友!

你可能感兴趣的:(.net,Flex,Blog)