2009-06-01 59 views
0

我正在重写纯MX中的MXML项呈示器。我似乎无法过去的一个问题是如何让每个项目渲染器对项目渲染器类上静态属性的更改作出反应。在MXML版本,我有以下的绑定设置的项目渲染:对静态属性进行响应

instanceProperty={callInstanceFunction(ItemRenderer.staticProperty)} 

什么是在AS设置此功能相当于方法(使用BindingUtils,我假设)?

UPDATE:
因此,我认为以下不能正常工作,但它看起来好像Flex是抑制instanceFunction引发的错误,使得它看起来好像绑定本身是坏的。

BindingUtils.bindSetter(instanceFunction, ItemRenderer, "staticProperty"); 

在给定的实例然而,当instanceFunction被调用,已初始化变量均为空,这是上面提到的错误的原因。任何想法,为什么这是?

回答

2

你有2个选择,我知道的:

选项1 可以挖成Flex编译器生成基于你的MXML,看看它是如何处理结合静态属性的代码。有一个叫做-keep-generated-actionscript的编译器指令会导致生成的文件停滞不前。仔细观察这些可以让你知道发生了什么。该选项将涉及实例化Binding对象和StaticPropertyWatcher对象。

选项2 有是获取在编译的时候加入到含有静态变量看到这个帖子http://thecomcor.blogspot.com/2008/07/adobe-flex-undocumented-buildin.html类staticEventDispatcher对象。根据这篇文章,这个对象只是基于静态变量而不是getter函数来添加的。

选项2 的示例假设我们有一个名为MyClassContainingStaticVariable一类名为MyStaticVariable静态变量和另一个变量some​​object.somearrayproperty,我们希望得到更新,每当MyStaticVariable变化。

Class(MyClassContainingStaticVariable).staticEventDispatcher.addEventListener(
PropertyChangeEvent.PROPERTY_CHANGE, 
function(event:PropertyChangeEvent):void 
{ 
    if(event.property == "MyStaticVariable") 
    { 
     someobject.somearrayproperty = event.newValue as Array; 
    } 
}); 
0

我认为你需要回应“PropertyChanged”事件。

+0

请您详细说明一下吗?该事件如何/何时发送? – Stiggler 2009-06-01 23:10:26

0

如果您打算这样做,请使用单例而不是静态。我不认为它会在静态工作。 (如果你必须这样做,那么可能有两种方法可以重新考虑,这会更好)。

var instance:ItemRenderer = ItemRenderer.getInstance(); 
BindingUtils.bindProperty(this, "myProperty", instance, "theirProperty"); 
+0

对不起,但我没有寻找一种不同的方法,因为这个似乎在MXML中起作用。我想知道幕后的工作。 – Stiggler 2009-06-01 23:11:15

+0

好吧,绑定为属性设置了事件侦听器。你不能听类对象,因为它不是一个EventDispatcher。如果你的类扩展了EventDispatcher并且你使用了单例方法,你可以这样做。和单身人士一样糟糕,静态类是最糟糕的。它可能在MXML中工作,但它几乎肯定不受限制。它可能只发现一次值,之后再也不会更新。 – 2009-06-03 20:36:57

0

与此摆弄了一阵后,我的结论是,目前这是不可能的ActionScript中,即使不bindSetter。似乎有一些MXML专用的数据绑定功能,可以从Adobe文档中摘录下来(尽管不是所有的代码都编译为AS代码)?

不能包括功能或阵列中的属性链 元素在数据 由 bindProperty()或bindSetter()方法定义绑定表达式。 有关属性 链的更多信息,请参阅使用可绑定 属性链。

来源:http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_7.html

0

您可以创建一个HostProxy类站在了功能可按电话。有点类似HostFunctionProxy类,它从代理扩展而来,它有一个getProperty("functionInvokeStringWithParameters")它将从主机远程调用该功能,并派发一个“更改”事件来触发典型的[Bindable("change")]代理类中的绑定。

您让HostProxy类充当主机,并使用该属性远程触发函数调用。当然,如果有一些TypeHelperUtil允许将运行时的原始字符串值转换为序列化类型值以供方法参数(通常用逗号分隔),那会更酷一些。

例如: 例如。

var standInHost:Object = new HostFunctionProxy(someModelClassWithMethod, "theMethodToCall(20,11)"); 
// With BindingUtils..... 
// bind host: standInHost 
// bind property: "theMethodToCall(20,11)" 

当然,您需要创建这样一个实用程序来帮助支持超出基本Flex处方的功能。看起来许多这种(更高级的)Flex绑定通常是在编译时完成的,但现在您必须创建代码,以便在运行时以完全跨平台的Actionscript方式执行此操作,而无需依赖Flex框架。