package views { import core.IModel; import core.ISimpleView; import events.ModelChangeEvent; import events.ViewInitializedEvent; import mx.binding.utils.ChangeWatcher; import mx.controls.ComboBox; import mx.events.PropertyChangeEvent; [Event(name="viewInitialized", type="events.ViewInitializedEvent")] public class ComboBoxView extends ComboBox implements ISimpleView { [Bindable] public var model:IModel; public var sort:Boolean = false; public var validMember:String; private var _member:String; public function get member() : String { return _member; } public function set member(newMember:String) : void { _member = newMember; } public override function initialize() : void { super.initialize(); ChangeWatcher.watch(this, "model", function(event:PropertyChangeEvent) : void { SimpleViewUtil.addEventListeners(event.oldValue as IModel, model, [member, validMember], changeHandler); }); addEventListener("change", function() : void { dispatchEvent(new ModelChangeEvent(ModelChangeEvent.MODEL_CHANGE, member, selectedItem)); }); SimpleViewUtil.addValidationListeners(this); } private function compare(a:Object, b:Object) : int { var labelA:String = itemToLabel(a); var labelB:String = itemToLabel(b); return labelA.localeCompare(labelB); } private function changeHandler(event:Event) : void { try { var data:Object = model[validMember]; if(sort) { if(data is XMLList) { var array:Array = new Array(); for each(var item:XML in data) { array.push(item); } data = array; } data = (data as Array).sort(compare); } dataProvider = data; } catch(o:Object) { dataProvider = null; return; } try { selectedItem = model[member]; } catch(o:Object) { selectedItem = null; } } } }