2010-04-16 58 views
2

观察下面的Flex程序(我正在使用Flex Builder 3 w/3.5 SDK)。第二个组合框的条件是第一个。如果选择了“名字”,那么您可以选择“姓氏”。如果选择“无”,则不允许您选择姓氏,而是提示您选择姓氏。为什么Flex 3中的组合框会令标签神秘地消失?

要查看消失标签的神秘问题,请运行该程序并选择名字。然后选择一个姓氏。一切都很好。然后在第一个组合框中选择“无”。第二个组合框的提示变回,并删除姓氏。一切都还好。然后尝试再次选择名字和姓氏。在选择名字后,您会看到姓氏不会显示,尽管它们的空格可以使用(并且如果您调试程序,数据提供程序中会显示正确的数据)。

这个'错误'一直在内部被杀死。我正在实施这个行为的项目比较复杂,但这个例子基本上是例证了发生了什么。这是Flex中的一个错误,还是我做错了什么?

谢谢!

<?xml version="1.0" encoding="utf-8"?> 

<mx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 

     [Bindable] 
     public var cbCompanyDP:ArrayCollection = new ArrayCollection([ { firstName: "None", data: 0 }, 
                     { firstName: "Bob", data: 1 }, 
                     { firstName: "Bart", data: 2 } ]); 

     [Bindable] 
     public var cbEmployeeDP:ArrayCollection = new ArrayCollection(); 

     public var employees:ArrayCollection = new ArrayCollection([ { lastName: "Smith" }, 
                     { lastName: "Smyth" }, 
                     { lastName: "Smick" }, 
                     { lastName: "Smack" } ]); 

     [Bindable] 
     public var prompt:String = "Choose First Name first"; 

     public function cbFirstNameChange(value:int):void 
     { 
      if (value == 0) 
      { 
       employees.removeAll(); 
       setEmpDP(employees); 
       prompt = "Choose First Name first"; 
      } 
      else 
      { 
       setEmployees(); 
       setEmpDP(employees); 
       prompt = "Now choose Last Name"; 
      } 
     } 

     private function setEmpDP(ac:ArrayCollection):void 
     { 
      cbEmployeeDP = ac; 
     } 

     private function setEmployees():void 
     { 
      employees = new ArrayCollection([ { lastName: "Smith" }, 
               { lastName: "Smyth" }, 
               { lastName: "Smick" }, 
               { lastName: "Smack" } ]); 
     } 
    ]]> 
</mx:Script> 

<mx:HBox> 

    <mx:ComboBox dataProvider="{cbCompanyDP}" 
     id="cbFirstName" 
     labelField="firstName" 
     width="200" 
     change="cbFirstNameChange(cbFirstName.selectedItem.data)" 
     prompt="Choose a first Name" /> 

    <mx:ComboBox dataProvider="{cbEmployeeDP}" 
     id="cbLastName" 
     labelField="lastName" 
     width="200" 
     prompt="{prompt}" /> 
</mx:HBox> 

+0

老兄!我试过你pgm,它在ma机器上显示没有这样的问题! – Anoop 2010-04-16 06:59:39

+0

那是令人沮丧的。你使用的是什么版本的Flex SDK?哪个版本的Flash Player? – eterps 2010-04-16 13:59:14

回答

2

这里的问题是,有是有约束力的缺失。 如果更改了ComboBox的dataProvider,它不会更改生成的下拉列表的dataProvider。所以箱子知道新的列表,但下拉菜单仍然处理旧的。 为了解决这个问题,你必须继承ComboBox并覆盖set dataProvider并获取dataProvider(用于对称)。

override protected function set dataProvider (value:Object):void { 
    super.dataProvider=value; 
    if(dropdown != null) 
    super.dropdown.dataProvider=value; 
} 

同时更新的情况下,下拉的宽度,组合框宽度改变,还需要重写另一个函数:

override protected function updateDisplayList 
    (unscaledWidth:Number, unscaledHeight:Number):void { 
    super.updateDisplayList (unscaledWidth, unscaledHeight); 
    if (dropdown != null) 
    dropdown.width = unscaledWidth; 
} 

这样它的作品,因为它应该。 如果你想,你可以在设置函数中检查selectedIndex是否为-1(在可编辑框上表示手动输入内容),从super.text保存并将其恢复到super.text(并设置索引为-1再次)一旦你已经设置了新的dataProvider。否则,输入字段中的文本将丢失或被第一个列表元素替换。

0

我试着用不同的SDK(3.2和4),它是工作,所以我想这是从3.5

0

的错误那么它看起来有两个答案: 是的,这是Flex 3.5 sdk中的一个错误,因为它在4中没有发生(我没有用其他SDK进行测试)。但是,由于我无法在项目中更改SDK,因此解决方法出现在另一个问题中: Flex 3.5.0; Update ComboBox display list upon dataprovider change

感谢大家的意见。

2

不要在Flex的3.5新的ArrayCollection设置为数据提供程序,如果数据提供商已设置 - 设置dataProvider.source(不使新的参考)

+0

这对我来说很有用,并且比将所有ComboBox实例更改为自定义组件更容易。 – Glenn 2011-11-15 22:42:06

1

我昨天刚有同样的问题。它似乎是3.5中的一个bug。 当您将新的ArrayCollection对象分配给组合框中绑定的一个时,会发生这种情况。如果您单击组合框,它将刷新并显示真实内容。

3.5中的解决方案:不要将新的arraycollection分配给绑定变量。由安东说,你应该只设置源,或利用添加/删除/项目的addAll像methods.Something这应该工作太:

private function setEmpDP(ac:ArrayCollection):void 
    { 

     cbEmployeeDp.removeAll(); 
     cbEmployeeDP.addAll(ac); 
    } 
相关问题