1

そのため、Flex はユーザーがデータ供給コントロールを操作するための優れた API を提供していますが、私の人生では、ユーザーが操作を終えた後にデータをコントロールから戻す方法がわかりません。具体的には、Tree コンポーネントで dragMove コントロールを有効にしましたが、ユーザーが開始した変更をデータベースに書き戻せる XML データに戻す方法がわかりません。

ユーザーがツリーを並べ替えても、dataProvider に変更は登録されず、dataDescriptor がこれらの変更を登録している場合、データを元に戻す方法がわかりません。dataDescriptor メソッド getData() は、ノード パラメータを呼び出します....どのノードですか? 独自の dataProvider からのノード?? 理解できません。何か案は?

4

3 に答える 3

1

CookieOfFortuneは正しいです。名目上のドラッグアンドドロップ以上のことを行おうとしている場合(たとえば、変更を検出してDBに伝達する場合)、ツリーのドラッグアンドドロップインターフェイスを操作する必要があります。

ツリーが変更されたとき(たとえば、選択が発生したとき)を検出するようにリスナーを設定することもできます。これは、選択とドラッグアンドドロップの両方で機能します。

あなたが何をしているのかわからないので、ここに小さなコードがあります。dragCompleteイベントを検出する方法を示すためだけに上書きしました。

<?xml version='1.0'?>
<mx:Application xmlns:mx='http://www.adobe.com/2006/mxml' backgroundGradientColors='[0xFFFFFF,0xAAAAAA]'>

    <mx:Script>
        <![CDATA[
        import mx.events.DragEvent;
        import mx.controls.Alert;

        [Bindable]
        private var treeData:XML =
            <root>
                <node label="foo">
                    <node label="bar" />
                </node>
                <node label="baz">
                    <node label="buzz">
                        <node label="foobar" />
                    </node>
                </node>
            </root>;

        private function detectChange(event:Event):void {
            Alert.show("change detected!");
        }
        private function detectDragComplete(event:DragEvent):void {
            Alert.show("drag completed!");
        }

        ]]>
    </mx:Script>

  <mx:Tree id="tree" labelField="@label" 
           dataProvider="{treeData.node}" width="200"
           dragEnabled="true"
           dropEnabled="true"
           dragMoveEnabled="true"
           dragComplete="detectDragComplete(event)"
           change="detectChange(event)" />
</mx:Application>

さまざまなコントロールのドラッグアンドドロップ機能に関する詳細情報へのリンクを次に示します。

于 2009-04-07T02:15:39.623 に答える
1

あなたがしなければならないことは、dragOver イベントをリッスンし、そのハンドラーで結果のデータを操作することだと思います。ドラッグ ドロップのサポートは、主に 1 つのリスト コントロールから別のコントロールに転送するためのものです。

于 2009-04-07T00:38:12.493 に答える
0

私はこれとまったく同じことをしなければなりませんでした。CollectionEvent.COLLECTION_CHANGE イベントで、ツリーの dataProvider にイベント リスナーを設定しました。

public function init():void{

        //watch the tree dataProvider changes.
        BindingUtils.bindSetter(setUpDataChangeListner,_tree,["dataProvider"]);
    }

    public function setUpDataChangeListner(value:XMLListCollection):void{
        //set up the event listener for the dataProvider as long as it is not null
        if(value)
            value.addEventListener(CollectionEvent.COLLECTION_CHANGE,onTreeChanged,false,0,true);
    }

    public function onTreeChanged(event:CollectionEvent):void{
        trace("fun");
    }
于 2009-05-08T15:41:54.133 に答える