如何根据已更改的绑定 dataProvider 内容调整 Flex 3 ComboBox 宽度?

Posted

技术标签:

【中文标题】如何根据已更改的绑定 dataProvider 内容调整 Flex 3 ComboBox 宽度?【英文标题】:How to get Flex 3 ComboBox width to adjust based on bound dataProvider contents having changed? 【发布时间】:2010-11-28 13:17:33 【问题描述】:

在 Flex 3 中,我在 MXML 组件中创建了一个 ComboBox,类似于以下内容:

<mx:ComboBox id="comboBox" dataProvider="_choices" />

<mx:Script>
<![CDATA[
  import mx.collections.ArrayCollection;
  // etc...
  public function get choices():ArrayCollection  return _choices; 

  [Bindable]
  private var _choices:ArrayCollection =
    new ArrayCollection( [  data: "ALL", label: "All"  ] );
  // etc...
]]>
</mx:Script>

</mx:HBox>

在父 MXML 应用程序中,我正在修改选择属性的内容:

myComponentId.choices.removeAll();
myComponentId.choices.addItem(data: "NY", label: "New York");
myComponentId.choices.addItem(data: "CA", label: "California");
// etc...

绑定正在工作,因为 ComboBox 会自动拾取运行时添加的新内容,但是它不会调整其宽度。 ComboBox 的初始宽度仅足以显示组件中声明的初始项“All”。但是,我希望并且希望 ComboBox 在绑定期间自动调整大小以显示“加利福尼亚”,但事实并非如此。

在向其 dataProvider 添加新的更宽的标签后,如何让 ComboBox 更新其宽度?谢谢!

【问题讨论】:

如何将宽度设置为 100% ... 如 comboBox.percentWidth = 100; ifeedme.com/blog/?p=19 - 有很好的解决方案 谢谢。这是一个很好的解决方案,但解决了一个不同的问题:试图让下拉列表的大小与折叠控件的大小不同。在更改内容后,我希望整个控件(无论是否折叠)成为最宽项的大小。 @CapnNefarious 对 invalidateSize() 的回答成功了。 大家:很抱歉没有早点回来。我刚刚浏览了解决方案并标记了对我有用的解决方案。 【参考方案1】:

您可能只需要调用invalidateProperties()invalidateDisplayList()invalidateSize() 或这三者的某种组合(我自己也是一个 flex 新手),以在更改后强制更新组件的测量值数据提供者或其内容。

myComponentId.invalidateSize();
myComponentId.invalidateDisplayList();
myComponentId.invalidateProperties();

【讨论】:

+1。修改选项后调用 invalidateSize() 确实会更新宽度。其他两个没有。 不管怎样,这在使用 mx:ComboBox 控件的 Flex 4 中似乎不起作用。【参考方案2】:

我会为choices 添加一个setter,并在setter 末尾的ComboBox 上调用validateNow()

public function set choices(value:ArrayCollection):void

    _choices = value;

    comboBox.validateNow();

【讨论】:

在修改选项后在组合框上调用 validateNow() 并没有 更新宽度。【参考方案3】:

我遇到了同样的问题,但这些都不适合我。我设法通过创建一个新的事件处理程序来解决这个问题

menuComboBox.addEventListener(ResizeEvent.RESIZE, updateListWidth);

在此事件中调用的方法只是调整 dropdown.width 属性的大小。

private function updateListWidth(event:ResizeEvent):void 
        menuComboBox.dropdown.width = menuComboBox.width;

【讨论】:

我试过你的代码,但没有解决问题。实际上,假设我正确阅读了这段代码,这并不是我遇到的问题。组合框在修改其内容后,即使在折叠 时也没有正确的大小。问题不只是下拉组件。

以上是关于如何根据已更改的绑定 dataProvider 内容调整 Flex 3 ComboBox 宽度?的主要内容,如果未能解决你的问题,请参考以下文章

在更新dataprovider的数据后保持我的排序

Flex 属性绑定到 datagrid dataProvider 数组

如何检查单选按钮是不是已与“更改”事件处理程序绑定

如何根据布尔值 (SwiftUI) 更改对象的绑定源?

微信如何解绑京东账号

如何根据组内日期之间的差异更改列?