使用组合框的selectedItem属性进行flex数据绑定更新很多次问题

时间:2010-01-23 03:08:55

标签: flex actionscript-3 data-binding

好吧,我有一个组合框,我把他的selectedItem属性绑定到一个值对象对象,就像这样

<fx:Binding source="styles_cb.selectedItem.toString()" destination="_uniform.style"/>
<fx:Declarations>
<fx:XML id="config_xml" xmlns="" source="config.xml" />
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<mx:ComboBox x="66.15" y="63.85" editable="false" id="styles_cb" dataProvider="{config_xml.styles.style}" />

值对象是一个带有一些setter和getter的自定义类,我想根据组合的selectedItem的值设置一个属性,所以在value对象里面我有这样的东西

[Bindable]
public function set style(value:String):void
{
_style = value;
trace(value);
}

我的问题是,每次我更改组合框选择实际上改变了值对象的样式属性时它会做3次,如果我跟踪setter的值它实际上做了3次跟踪,为什么?我怎么能避免这个?我做错了什么?或者有更好的方法,请帮助,谢谢你的帮助

2 个答案:

答案 0 :(得分:1)

数据绑定表达式的爆发频率超过预期。我不知道确切的原因。如果这会导致您的应用出现问题,请不要将源直接绑定到目标,而是使用失效。绑定源以设置标志stylesSelectedItemChanged并调用invalidateProperties()。然后重写commitProperties()并在commitProperties()中,检查stylesSelectedItemChanged是否为true,如果是,则将新值传播到目标并将标志重置为false。一定要调用super.commitProperties(),否则很多东西都会破坏。

失效在Flex框架中非常常见,每个组件都在内部使用它,并且它对这些问题有很大帮助。

答案 1 :(得分:1)

哇!!,有时候写一个问题让你考虑两次并让你自己找到答案,所以我找到了我自己的解决方案,在文档中说我可以使对象的所有属性都可绑定如果我将[Bindable]放在类声明中,所以我就这样做了

[Bindable]
[RemoteClass(alias='Uniform')]
public class Uniform extends Object implements IEventDispatcher

然而,当我试图在我在文档中发现的事件中发送一个事件时,我必须添加这样的事件名称

[Bindable("styleChanged")]
public function get style():String
{
   return _style;
}

public function set style(value:String):void
{
 _style = value;
 dispatchEvent(new Event("styleChanged"));
}

现在我发现这样做,用双重绑定标记属性,这让我多次设置属性,hugg!,但是现在我知道我可以避免使用第二个[Bindable]并且仍然事件得到调度,所以现在我想知道为什么我需要首先使用[Bindable(“styleChanged”)]如果我仍然可以只用[Bindable]和调度方法来调度事件?,很奇怪

希望对某人有所帮助