【问题标题】:Silverlight combobox number of items shown refreshSilverlight 组合框显示的项目数刷新
【发布时间】:2009-04-28 19:03:20
【问题描述】:

我在 SL 页面上有两个组合框。当 Combo 1 更​​新时,会调用一个服务并填充 Combo 2。

第一次调用时,返回 3 个结果。当组合框展开时,您可以看到所有 3 个选项。

在第二次调用时,返回 4 个结果。当组合框展开时,您可以看到 3 个选项,带有一个垂直滚动条。

如果我重新加载并反向执行这些步骤,我会在第一次调用时得到 4 行,在第二次调用时得到 3 行 + 一个空白行。 (不,空白不是记录,不能选择。)

下拉列表大小似乎保持了第一个生成的高度。

如何刷新每次服务调用后显示的组合框最大项目数?

谢谢!

编辑#1

代码遵循 M-V-VM 模式。当页面加载时,Group1 填充第一个组合框,并且没有选择任何内容。当用户进行选择时,该选择将绑定到 Group1Selection。

<ComboBox ItemsSource="{Binding Path=Group1}" SelectedItem="{Binding Path=Group1Selection}" />
<ComboBox ItemsSource="{Binding Path=Group2}" SelectedItem="{Binding Path=Group2Selection}" />

在视图模型中,在 Group1Selection 属性的 set 访问器中,我有类似的东西

set
{
    if (group1Selection != value)
    {
        group1Selection = value;
        PopulateGroup2();
        OnPropertyChanged("Group1Selection");
    }
}

PopulateGroup2 在哪里异步执行我的服务调用,获取数据,并将该数据放入 Group2 的公开属性中。

在“正常”条件下,这不是问题,因为大多数选项都有数十种可能的选择。但是,Group1 的几个选项只有 3 或 4 个子选项。如果首先选择其中一个,则该应用程序实例的其余部分的 ComboBox 的高度分别设置为 3 或 4,而不是最多显示 8 个项目。

遵循 M-V-VM 模式,代码隐藏中没有代码。

【问题讨论】:

  • 您是否在组合框 2 ItemsSource 中使用数据绑定? XAML 是什么样的?
  • 如果不使用数据绑定,代码是什么样子的?

标签: silverlight combobox silverlight-2.0


【解决方案1】:

这是 Silverlight 2 中 ComboBox 中的一个已知错误。我认为它已在 SL 3 中修复。

您可以通过执行以下操作来解决此问题:

  1. 从组合框继承

    公共类 MyComboBox : ComboBox

  2. 在 OnApplyTemplate() 方法中获取对 ComboBox 的“弹出”部分的引用

        Popup thePopup = GetTemplateChild("Popup") as Popup;
        FrameworkElement thePopupContent = thePopup.Child as FrameworkElement;
    
  3. 重写 OnItemsChanged 方法

  4. 在重写的 OnItemsChagned 方法中,使用 ClearValue(DP) 方法重置 Popup 上的 Height 和 Width 依赖属性。

            thePopupContent.ClearValue(FrameworkElement.WidthProperty);
            thePopupContent.ClearValue(FrameworkElement.HeightProperty);
    

如果您也担心这些属性,可以清除 Max 和 Min Height & Width 属性。

【讨论】:

  • 完全痛苦 - 但比破坏组合框并为孩子添加新组合框的替代方案要好得多。
  • 这是我见过的这个问题的最佳解决方案。谢谢!
  • 是的,我完全同意......但你必须做你必须做的事情:o) SL2,我爱你,但我等不及 SL3 到 RTM!
  • 你也可以直接获取PopupBorder(即Popup的孩子)。仍然是一个很好的解决方案。
【解决方案2】:

这是一个完美的解决方案。谢谢你。

对于那些感兴趣的人来说,这个类看起来像这样:

using System.Windows.Controls.Primitives; 

public class WorkAroundComboBox: ComboBox
{
    FrameworkElement thePopupContent;

    public override void OnApplyTemplate()
    {
        Popup thePopup = GetTemplateChild("Popup") as Popup;
        thePopupContent = thePopup.Child as FrameworkElement;
        base.OnApplyTemplate();
    }

    protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        thePopupContent.ClearValue(FrameworkElement.WidthProperty);
        thePopupContent.ClearValue(FrameworkElement.HeightProperty);
        base.OnItemsChanged(e);
    }
}

}

【讨论】:

    【解决方案3】:

    我认为问题在于 Silverlight 没有完全意识到 ComboBox 2 背后的数据已经改变。也许尝试将 OnPropertyChanged("Group2") 添加到 Group1 的集合中 - 这应该有助于 Silverlight 意识到它需要更新 ComboBox 2 的绑定。

    Group2Selection 调用OnPropertyChanged 也可能会有所帮助,因为之前的值不再有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2011-08-05
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多