[Flex 3] ComboBox bug ?

Dropdown của combo box không tự động “re-draw” khi dataProvider của combobox thay đổi ? Chưa thể khẳng định đây là một bug của Flex 3.x, nhưng điều này gây nên sự khó hiểu khi làm việc với combobox của Flex 3.x. Trong ví dụ dưới đây có 2 combobox, tạm thời gọi một cái là source combo và cái còn lại là target combo. Khi dữ liệu ở source combo thay đổi thì target combo sẽ thay đổi theo.

<mx:WindowedApplication name="Screen_screens_test"
        xmlns:mx="http://www.adobe.com/2006/mxml"
        layout="vertical" verticalAlign="middle"
	horizontalScrollPolicy="off" verticalScrollPolicy="off">
    <mx:Script>
        <![CDATA[
			import mx.collections.ArrayCollection;
			import flash.events.Event;

			[Bindable]
			public var targetDP: ArrayCollection;

			public function comboChangeHandler(e:Event): void {
				switch (sourceCombo.selectedIndex) {
					case 0:
						targetDP = new ArrayCollection( [ { label:"A1", data:"A1" }, { label:"A2", data:"A2" }, { label:"A3", data:"A3" } ]);
					break;

					case 1:
						targetDP = new ArrayCollection( [ { label:"B2", data:"B1" }, { label:"B2", data:"B2" }, { label:"B3", data:"B3" } ]);
					break;

					case 2:
						targetDP = new ArrayCollection( [ { label:"C3", data:"C1" }, { label:"C2", data:"A2" }, { label:"C3", data:"C3" } ]);
					break;

					case 3:
						targetDP = new ArrayCollection( [ { label:"D4", data:"D1" }, { label:"D2", data:"A2" }, { label:"D3", data:"D3" } ]);
					break;

					default:
					break;
				}
				targetCombo.dataProvider = targetDP;
			}
        ]]>
    </mx:Script>
	<mx:HBox width="100%">
		<mx:ComboBox id="sourceCombo" change="{comboChangeHandler(event)}">
			<mx:ArrayCollection>
				<mx:Array id="myArray">
					<mx:Object label="A Classes" data="a"/>
					<mx:Object label="B Classes" data="b"/>
					<mx:Object label="C Classes" data="c"/>
					<mx:Object label="D Classes" data="d"/>
				</mx:Array>
			</mx:ArrayCollection>
		</mx:ComboBox>
		<mx:ComboBox id="targetCombo" />
	</mx:HBox>
</mx:WindowedApplication>

Tuy nhiên khi thi hành đoạn code trên,  text ở target combo thay đổi, nhưng nội dung dropdown list của nó thì không. Có vẻ Flex xem dropdown là một component không phụ thuộc vào combobox :|.

Việc fix bug này thực ra khá đơn giản, bạn có thể viết 1 class extend lại từ mx.controls.ComboBox và override phương thức getter/setter dataProvider

[Bindable]
override public function get dataProvider():Object {
	return super.dataProvider;
}

[Bindable]
override public function set dataProvider(ac:Object):void {
	super.dataProvider = ac;
	if (this.dropdown) {
		this.dropdown.dataProvider = ac;
	}
}

Cách khác là tìm cách gán lại dataProvider cho dropdown. Như ví dụ ban đầu, chỉ cần thêm

targetCombo.dropdown.dataProvider = targetDP;

phía dưới

targetCombo.dataProvider = targetDP;