Apache flex AdobeFlexComboBox数据提供程序

Apache flex AdobeFlexComboBox数据提供程序,apache-flex,combobox,dataprovider,Apache Flex,Combobox,Dataprovider,我有一个用Flex 3.2 SDK编译的项目 我的一个组件是combobox,它绑定到Cairngorm模型中的一个属性(称为products)。如果我在model.products中插入新值,则组合框会立即显示新值。工作完美 然后我转到3.5 SDK,运行相同的操作会导致问题。即使模型已经更新(我已经验证了确实如此),组合框也没有正确显示新值-它似乎知道有一个新项,因为组合中有一个新行,但新行是空白的,不可选择。组合中的现有项在那里并且是可选择的(它们应该是)。如果我重新初始化表单(即关闭并重

我有一个用Flex 3.2 SDK编译的项目

我的一个组件是combobox,它绑定到Cairngorm模型中的一个属性(称为products)。如果我在model.products中插入新值,则组合框会立即显示新值。工作完美

然后我转到3.5 SDK,运行相同的操作会导致问题。即使模型已经更新(我已经验证了确实如此),组合框也没有正确显示新值-它似乎知道有一个新项,因为组合中有一个新行,但新行是空白的,不可选择。组合中的现有项在那里并且是可选择的(它们应该是)。如果我重新初始化表单(即关闭并重新打开组合框所在的标题窗口),则组合框中会显示所有正确的值(包括新值)

我在3.2和3.5之间来回交换了几次,以验证这确实是根本原因


如果您有任何关于如何解决此问题的想法,我们将不胜感激。

您是在更换数据提供程序还是在更换它

我注意到,在Flextras AutoCompleteComboBox的Flex4版本中,ComboBox数据提供程序有时与下拉列表的数据提供程序不同步。我想这都是我的错,因为我在组合框中添加了AutoComplete

完全有可能在Flex 3.5中添加了此更改;直到我的Flex 4冒险,我才注意到这一点

首先,当数据提供程序更改时,我会尝试使组合框无效。您可以通过侦听集合的collectionChange事件来执行此操作。在事件处理程序中,只需执行以下操作:

myCombo.invalidateProperties()
myCombo.invalidateDisplayList()
如果要重新对数据提供程序进行定价,则可以尝试覆盖set-dataPRovider方法并添加如下行:

this.dropdown.dataProvider = value;

这是一个奇怪的问题。我相信在Flex3/3.2中,每次数据提供者更改下拉列表时,下拉列表都会被关闭[销毁]并重新创建。他们似乎在某个时候停止了这样做;这导致了这种反常现象

组合的数据提供程序设置为可绑定模型(Cairngorm)。因此,在命令结果中更新模型会自动弹出组合框。嗯,反正以前是这样的。经过更多的测试,我似乎必须重置数据提供者:cb_products.dataprovider=model.products;这有点糟糕。事实上,上述方法不起作用。然而,似乎cb_products.dropdown.dataProvider=model.products确实如此。这仍然很糟糕。你正在用代码替换数据提供者。在3.2和3.5之间的某个地方,组合框中一定添加了一个边缘bug。您可能可以扩展ComboBox并覆盖set-dataProvider方法以在内部执行此更新,这样您就不必手动执行此更新。这在3.5中几乎被确认为一个bug。我讨厌使用monkey patchI,幸运的是,我已经将ComboBox扩展成了一个自定义组件,我几乎在我的应用程序中的任何地方都使用它,所以只需将以下内容添加到我的自定义组件中即可:private var newDropDown:ListBase;重写公共函数集数据提供程序(值:对象):void{super.dataProvider=value;newDropDown=dropdown;if(newDropDown){validateSize(true);newDropDown.dataProvider=super.dataProvider;}}
//this will replace the list base on an update
private var newDropDown:ListBase;

//This addresses a bug in flex 3.5 SDK 
//where the list base does reflect changes to the data provider
//forums.adobe.com/thread/597632  
//bugs.adobe.com/jira/browse/SDK-25705 
//bugs.adobe.com/jira/browse/SDK-25567
override public function set dataProvider(value:Object):void
{
    super.dataProvider = value;
    newDropDown = dropdown;

    if(newDropDown)
    {
        validateSize(true);
        newDropDown.dataProvider = super.dataProvider;
    }
}