Silverlight组合框显示的项目数量刷新

时间:2009-04-28 19:03:21

标签: silverlight combobox silverlight-2.0

我在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}" />

在viewmodel中,在Group1Selection属性的set访问器中,我有类似

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

  1. 从ComboBox继承

    公共类MyComboBox:ComboBox

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

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

  4. 在重写的OnItemsChagned方法中重置高度&amp;使用ClearValue(DP)方法在Popup上使用宽度依赖性属性。

            thePopupContent.ClearValue(FrameworkElement.WidthProperty);
            thePopupContent.ClearValue(FrameworkElement.HeightProperty);
    
  5. 您可以清除最大和最小高度&amp;宽度属性,如果你也担心这些。

答案 1 :(得分:2)

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

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

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);
    }
}

}

答案 2 :(得分:0)

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

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