1

我正在用纯 AS 重写一个 MXML 项目渲染器。我似乎无法解决的一个问题是如何让每个项目渲染器对项目渲染器类上的静态属性的更改做出反应。在 MXML 版本中,我在项目渲染器上设置了以下绑定:

instanceProperty={callInstanceFunction(ItemRenderer.staticProperty)}

在 AS 中设置它的等效方法是什么(我假设使用 BindingUtils)?

更新:
所以我认为以下内容不起作用,但似乎 Flex 正在抑制 instanceFunction 中引发的错误,使其看起来好像绑定本身是坏的。

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

但是,当调用 instanceFunction 时,给定实例上已经初始化的变量全部为空,这就是上面提到的错误的原因。任何想法为什么会这样?

4

5 回答 5

3

我知道您有 2 个选项:

选项 1 您可以深入研究 flex 编译器基于您的 MXML 构建的代码,以了解它如何处理与静态属性的绑定。有一个名为 -keep-generated-actionscript 的编译器指令会导致生成的文件保留下来。通过这些进行调查可以让您了解发生了什么。此选项将涉及实例化 Binding 对象和 StaticPropertyWatcher 对象。

选项 2 在构建时将 staticEventDispatcher 对象添加到包含静态变量的类中,请参见这篇文章http://thecomcor.blogspot.com/2008/07/adobe-flex-undocumented-buildin.html。根据帖子,该对象仅根据静态变量的存在而不是 getter 函数来添加。

选项 2 的示例 假设我们有一个名为 MyClassContainingStaticVariable 的类,其中有一个名为MyStaticVariable静态变量和另一个变量 someobject.somearrayproperty,我们希望在 MyStaticVariable 更改时对其进行更新。

Class(MyClassContainingStaticVariable).staticEventDispatcher.addEventListener(
PropertyChangeEvent.PROPERTY_CHANGE,
function(event:PropertyChangeEvent):void
{
    if(event.property == "MyStaticVariable")
    {
        someobject.somearrayproperty = event.newValue as Array;
    }
});
于 2012-03-07T17:41:34.193 回答
0

我认为您需要响应“PropertyChanged”事件。

于 2009-06-01T22:37:03.197 回答
0

如果您要这样做,请使用单例而不是静态。我认为它不适用于静态。(如果你必须这样做,可能有几种方法可以让你重新处理它会更好)。

var instance:ItemRenderer = ItemRenderer.getInstance();
BindingUtils.bindProperty(this, "myProperty", instance, "theirProperty"); 
于 2009-06-01T23:03:14.050 回答
0

在摆弄了一段时间之后,我得出的结论是,目前这在 ActionScript 中是不可能的,甚至在 bindSetter 中也是如此。从 Adob​​e 文档的以下摘录来看,似乎有一些仅限 MXML 的数据绑定功能(尽管它不是全部编译为 AS 代码)?

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

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

于 2009-08-12T00:44:19.900 回答
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 框架。

于 2010-03-14T14:09:47.123 回答