0

labelとvalueの2つのプロパティを持つバインド可能なモデルクラス(myModelと呼びます)があります。値は頻繁に更新されるため、バインド可能としてマークされます。これまでのところ正常に動作し、データが更新され、標準のプロパティ変更イベントがディスパッチされます。

次に、このモデルのオブジェクトインスタンスからArrayCollectionを作成して、データグループのデータプロバイダーとして使用する必要があります。次に、データはカスタムitemRendererに渡され、そこでdata.labelとdata.valueを介してmyModelプロパティにアクセスします。

私が今抱えている唯一の問題は、myModel値プロパティがそれ以上変更されないことです(オブジェクトをArrayCollectionに格納したためだと思います)。

myModelの新しいオブジェクトインスタンスを実行時に追加できるため、ArrayCollectionもバインド可能としてマークされています。

これを機能させる方法はありますか?これに関する助けをいただければ幸いです。

編集:myModelクラスの値オブジェクトが別のバインド可能なクラスによって更新されていることをほとんど忘れていました。はい、私はそれがばかげていることを知っていますが、それが私がここにいる理由です。この問題を解決するためのより簡単な(そして実際に機能している)方法についていくつかの情報を得るためです。

2番目の編集:わかりました。問題を説明するためのコードを少し追加します。

最初のバインド可能なクラスから始めましょう。

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

   public function FirstClass()
   { }
 }

値(1番目から3番目)は、コントローラークラスによって更新されます。ここまでは順調ですね。次に、2番目のモデルクラスに移ります(一貫性の問題については、MyClass名を保持しましょう)

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

   public function FirstClass()
   { }
 }

これらは2つのモデルクラスです。この背後にある背景は、FirstClassのインスタンスの各プロパティに文字列値(ラベル)が必要なことです。私はこれをもっと簡単にしたいので、私はこの「解決策」のに本当に落ち着きません;)。

とにかく、2つのモデルがあります。これが私の.mxmlクラスです。

[Bindable] private var firstClassInstance:FirstClass;

新しいArrayCollectionを作成し、次のようなオブジェクトを追加します。myArrayCollection.addItem(new MyClass( "これはラベルです"、firstClassInstance.firstValue));

また、DataGroupはこのArrayCollectionをデータプロバイダーとして使用します。

すでに確立しているように(@Windownsに感謝)、ArrayCollectionは、追加または削除されたオブジェクトのみを検索し、これらのオブジェクトのプロパティの変更は検索しません。

4

4 に答える 4

1

バインディングには多くの問題がある可能性があります。何が起こっているかを確認するためにコードを投稿してください。ここにあなたの質問に答えるかもしれない注意すべきいくつかの「ハイレベル」なものがあります

オブジェクトのバインド可能なarraycollectionを使用する場合、arraycollectionのバインディングは、各オブジェクトインスタンスと、それがコレクションに追加または削除されたかどうかのみを確認することに注意することが重要です。オブジェクトに発生するプロパティの変更については認識されません。通常、itemrendererを使用する場合、プロパティは表示要素にバインドされます。おそらく、itemrendererのラベルにバインドされた「value」プロパティのように。これで、オブジェクトインスタンス(myModel)が「value」プロパティを変更すると、ラベルがそれを取得する必要があります。また、ビジュアル要素にバインドするプロパティを[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に変更が記録されることはありません。他のすべてのオブジェクトが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

みんな(そしてギャル;))BindingUtilsを2時間いじった後、私はついに私の問題の解決策を見つけました。2つのモデルクラスはそのままにしておくことができるため、FirstClassのインスタンスを渡す必要はありません。FirstClassのvalueプロパティをMyClassのvalueフィールドにバインドするだけで期待どおりに機能し、ArrayCollectionの値も更新されます。

したがって、解決策。

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

次に、myClassObjectをArrayCollectionに追加するだけです。

ここでのコードはすべて擬似コードであるため、タイプミスは気にしないでください。

それでも、FirstClassオブジェクトをMyClassに渡すことを提案する@Windownsは、プロパティ間の切り替えを非常に簡単にするため、最終的なソリューションに組み込まれます(FirstClassには、最初の投稿の4つだけでなく、多くのプロパティがあります)。どうもありがとう!

于 2011-12-07T09:13:18.417 に答える
0

私はエイミーのアドバイスを受けて、itemUpdatedメソッドについてもう少し調べました。結局のところ、解決策はそこにありました。

ここを参照してください:http://flex4examples.wordpress.com/2009/08/28/1st/

私はこの方法論を(少しのバリエーションで)コードに適用しましたが、それは非常にうまく機能します。iPad2のパフォーマンスは良好で、コンポーネントのメモリ使用量も良好です。

エイミーがこのソリューションでも問題ないことを期待しましょう。成功を祈っている。;)

于 2011-12-08T09:57:36.530 に答える