гибкая привязка данных со свойством selectedItem обновления выпадающего списка многократно - PullRequest
1 голос
/ 23 января 2010

хорошо, у меня есть выпадающий список, который я привязал его свойство 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}" />

объект значения - это пользовательский класс с некоторыми установщиками и получателями, и я хочу установить свойство на основе значения selectedItem в комбинированном списке, поэтому внутри объекта значения у меня есть что-то вроде этого

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

Моя проблема в том, что каждый раз, когда я изменяю выделение в выпадающем списке, которое фактически изменяет свойство стиля объекта-значения, оно делает это 3 раза, если я отслеживаю значение установщика, то оно фактически выполняет 3-кратное отслеживание, почему ?? как я могу избежать этого? Я делаю что-то не так? или есть лучший способ сделать это, пожалуйста, помогите, спасибо за любую помощь

Ответы [ 2 ]

1 голос
/ 23 января 2010

вау !!, иногда, когда вы пишете вопрос, вы дважды обдумываете его и позволяете вам найти ответ самостоятельно, поэтому я нахожу свое собственное решение, в документации сказано, что я могу сделать все свойства объекта связанными, если я положить [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], и ​​все же событие get dispatch Итак, теперь мне интересно, почему мне нужно использовать [Bindable ("styleChanged")] в первую очередь, если я все еще могу обработать событие только с помощью [Bindable] и метода отправки?, странно

надеюсь, что это поможет кому-то

1 голос
/ 23 января 2010

Обычно выражения привязки данных запускаются во много раз больше, чем можно было ожидать. Я не знаю точную причину. Если это вызывает проблемы для вашего приложения, то не привязывайте источник напрямую к цели, вместо этого используйте аннулирование. Свяжите источник, чтобы установить флаг, stylesSelectedItemChanged и вызвать invalidateProperties (). Затем переопределите commitProperties () и внутри вашего commitProperties (), проверьте, имеет ли stylesSelectedItemChanged значение true, и если это так, распространите новое значение вперед по назначению и сбросьте флаг на false. Обязательно вызовите также super.commitProperties (), иначе многие вещи сломаются.

Инвалидация чрезвычайно распространена в инфраструктуре Flex, каждый компонент использует ее внутри, и это очень помогает при решении подобных проблем.

...