0

モデル クラスのインスタンスを保持する ArrayCollection によって伝達されたリストがあります。このモデル クラスには、株価を保持するディクショナリへのクラス参照があります。当然、これらの値は常に更新されます。

並べ替え関数を ArrayCollection に適用すると、正しい並べ替えが行われますが、並べ替え関数は常に実行されますが、一度だけ実行する必要があります。そのため、ArrayCollection を初めて並べ替えた直後に並べ替えを停止する必要があります。

私の並べ替え関数は、ヘッダー ボタンのクリックでトリガーされます (私は、モバイル用に最適化されたリスト ベースの DataGrid で作業しているため、ArrayCollection を常に並べ替える必要がないだけでなく、パフォーマンスも必要です)、次のようになります。

private function headerClick(event:MouseEvent):void {

    sField = event.currentTarget.id;        
    var sort:Sort = new Sort();
    sort.compareFunction = fidSort;

    (_list.dataProvider as ArrayCollection).sort = sort;
    (_list.dataProvider as ArrayCollection).refresh();
}

private function fidSort(a:Object, b:Object, fields:Array = null):int {

    if(a.fidList.fidMap[sField].fieldValue == b.fidList.fidMap[sField].fieldValue) {
        return 0;
    } else if(a.fidList.fidMap[sField].fieldValue > b.fidList.fidMap[sField].fieldValue) {
       return 1;
    } else{
       return -1;
    }
}

では、単純にブール値を関数の最後に置いて並べ替えを停止する以外に、並べ替えプロセスを停止する方法はありますか? これは、値が更新されるたびに関数がディスパッチされることを意味し、望ましくない動作です。

4

1 に答える 1

2

Al_Birdy の言うとおりです。これは a ListCollectionView(ArrayCollection拡張) のデフォルトの動作です。 項目が変更されたときに CollectionChange および PropertyChange イベントがコレクションによって送出されないようにするListCollectionView、という名前のメソッドを定義します。disableAutoUpdate()

これにより、ソートのトリガーが停止します。それはまだ理想的ではありません.b / cこのメソッドを呼び出すと、コレクションは明らかにすべての変更を追跡するため、後でenableAutoUpdate().

これを回避するには、自分でデータを並べ替えてから、並べ替えられたデータで を作成しArrayCollectionます。

于 2012-05-21T16:41:44.960 に答える