Непонимание основ динамического связывания данных (bindPropety) во Flex - PullRequest
5 голосов
/ 07 июня 2010

Мне нужно динамически связать свойства компонентов, созданных во время выполнения. В этом конкретном случае, пожалуйста, предположите, что мне нужно использовать bindProperty.

Я не совсем понимаю, почему следующий упрощенный тест не работает (см. Код). Когда я нажимаю кнопку, текст метки не меняется.

Я понимаю, что существуют более простые способы использования этого конкретного примера с использованием традиционного нединамического связывания, но мне нужно понять его с точки зрения использования bindProperty.

Может кто-нибудь помочь мне понять, что мне не хватает?

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="Tools.*" minWidth="684" minHeight="484" xmlns:ns2="*" creationComplete="Init();">
  <mx:Script>
    <![CDATA[
      import mx.collections.ArrayCollection;
      import mx.binding.utils.*;
      public var Available:ArrayCollection=new ArrayCollection();

      public function get Value():String {
        return (Available.getItemAt(0).toString());
      }

      public function Init():void {
        Available.addItemAt('Before', 0);
        BindingUtils.bindProperty(Lab, 'text', this, 'Value');
      }

      public function Test():void {
        Available.setItemAt('After', 0);
      }
    ]]>
  </mx:Script>
  <mx:Label x="142" y="51" id="Lab"/>
  <mx:Button x="142" y="157" label="Button" click="Test();"/>
</mx:WindowedApplication>

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 07 июня 2010

Как уже упоминал Гленн, вам нужно добавить тег [Bindable] в Value.

Кроме того, вы не определили установщик для свойства.Привязка данных вызывается только тогда, когда вызывается соответствующий установщик.Эта последовательность действий выглядит примерно так: вы вызываете установщик - Flex обновляет данные, вызывая получатель.

  [Bindable]
  public function get value():String {
    return (Available.getItemAt(0).toString());
  }

  public function set value(v:String):void {
    Available.setItemAt(v, 0);
  }

  public function init():void {
    Available.addItemAt('Before', 0);
    BindingUtils.bindProperty(Lab, 'text', this, 'Value');
  }

  public function iest():void {
    value = "After";
  }

Обратите внимание, что я изменил имена функций и свойств на строчные в соответствии с обычным соглашением,InitialCaps используются только для имен классов.

1 голос
/ 07 июня 2010

Я никогда не использую BindingUtils, но, по-моему, вам не хватает тега [Bindable] в поле «Значение».

...