0

我有一个具有两个属性标签和值的可绑定模型类(我们称之为 myModel)。该值经常更新,因此它被标记为可绑定。到目前为止工作正常,数据已更新并已调度标准属性更改事件。

现在我必须从这个模型的对象实例中创建一个 ArrayCollection 以将其用作数据组中的数据提供者。然后将数据传递给自定义 itemRenderer,在其中我通过 data.label 和 data.value 访问 myModel 属性。

我现在遇到的唯一问题是 myModel value 属性不再更改(我想是因为我将对象存储在 ArrayCollection 中)。

顺便说一句,ArrayCollection 也被标记为可绑定的,因为 myModel 的新对象实例可以在运行时添加。

有什么办法可以使这项工作?任何有关这方面的帮助将不胜感激!

编辑:我差点忘了,myModel 类中的值对象是由另一个可绑定类更新的。是的,我知道这很疯狂,但这就是我来这里的原因,以获得一些更简单(实际上有效)的方法来解决这个问题。

第二次编辑:好的,一些代码来说明这个问题;

让我们从第一个可绑定类开始;

[Bindable]
public class FirstClass
{
   public var name:String;
   public var firstValue:Number;
   public var secondValue:Number;
   public var thirdValue:Number;

   public function FirstClass()
   { }
 }

值(第一到第三)由控制器类更新。到目前为止,一切都很好。现在到第二个模型类(为了一致性,让我们保留 MyClass 名称)

[Bindable]
public class MyClass
{
   public var label:String;
   public var value:Number;

   public function FirstClass()
   { }
 }

这是两个模型类。这背后的背景是,我需要 FirstClass 实例的每个属性的字符串值(标签)。我想让这更简单,所以我真的不喜欢这个“解决方案”咳嗽;)。

无论如何,我们已经有了这两个模型,现在到我的 .mxml 类;

[Bindable] private var firstClassInstance:FirstClass;

我创建一个新的 ArrayCollection 并添加这样的对象;myArrayCollection.addItem(new MyClass("这是一个标签", firstClassInstance.firstValue));

同样,DataGroup 使用这个 ArrayCollection 作为数据提供者。

正如我们已经建立的(感谢@Windowns),ArrayCollection 仅查找正在添加或删除的对象,而不是这些对象的属性更改。

4

4 回答 4

1

绑定可能有很多问题。请发布代码以帮助我们了解发生了什么。以下是一些需要注意的“高级”事项,可能会回答您的问题

使用对象的可绑定数组集合时,请务必注意,数组集合的绑定仅查看每个对象实例以及它是否已从集合中添加或删除。它不会知道您的对象发生的任何属性更改。通常,当您使用 itemrenderer 时,属性会绑定到显示元素。就像绑定到 itemrenderer 中的标签的“值”属性一样。现在,当您的对象实例(myModel)更改它的“值”属性时,标签应该将其拾取。另请注意,您需要使用 [Bindable] 元标记标记您打算绑定到可视元素的任何属性。

public class myModel
{
    [Bindable]
    public var label:String;
    [Bindable]
    public var value:String; 

    public function myModel() {}
}

代码发布后回答:

当您执行以下操作时:

myArrayCollection.addItem(new MyClass("This is a label", firstClassInstance.firstValue));

您正在获取 firstClassInstance.firstValue 的值并将其作为硬值提供(如不通过引用传递值)。因此,如果您执行以下操作:

myArrayCollection.getItemAt(addedClassIndex).value = 5;

不会导致在 firstClassInstance.firstValue 中记录任何更改,因为没有存储“引用信息”。我们只使用基本类型的 Number ,它永远不会像 Flex 中的所有其他对象一样通过引用传递。

也许试试这个:

[Bindable]
public class MyClass
{
    public var label:String;

    [Bindable]   //might be redundant due to global [Bindable] flag, been a while since i've used a global one
    public function get value():Number{
        return m_objRef.firstValue;
    }
    public function set value(value:Number):void{
        m_objRef.firstValue = value;
    }

    private var m_objRef:FirstClass;

    public function MyClass(_label:String, _valueObj:FirstClass) {
        m_objRef = _valueObj;
        label = _label;
    }
}
于 2011-12-05T17:36:48.643 回答
1

当您更新存储在其中的项目的“一块”时,请在 ArrayCollection 上调用 itemUpdated。

于 2011-12-05T18:18:16.367 回答
0

我听取了 Amy 的建议,并进一步研究了 itemUpdated 方法。事实证明,解决方案就在那里。

见这里: http: //flex4examples.wordpress.com/2009/08/28/1st/

我将这种方法(几乎没有变化)应用于我的代码,并且效果很好。iPad2 的性能很好,我的组件的内存使用也很好。

让我们希望艾米也能接受这个解决方案。手指交叉。;)

于 2011-12-08T09:57:36.530 回答
0

好吧,伙计们(和女孩们;))在搞砸了 BindingUtils 两个小时后,我终于找到了解决问题的方法。这两个模型类可以保持原样,因此不需要传递 FirstClass 的实例。只需将 FirstClass 的 value 属性绑定到 MyClass 的 value 字段即可按预期工作,并且 ArrayCollection 中的值也会得到更新。

所以解决方案;

myClassObject = new MyClass();
myClassObject.label = "This is a label";
BindingUtils.bindProperty(myClassObject, "value", firstClassObject, "firstValue");

然后只需将 myClassObject 添加到 ArrayCollection。

请记住,这里的所有代码都是伪代码,所以不要介意任何拼写错误。

尽管如此,@Windowns 建议将 FirstClass 对象传递给 MyClass 将被合并到我的最终解决方案中,因为它使属性之间的切换变得更加容易(FirstClass 有很多属性,而不仅仅是我第一篇文章中的 4 个)。非常感谢!

于 2011-12-07T09:13:18.417 回答