我在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模式,代码隐藏中没有代码。
答案 0 :(得分:4)
这是Silverlight 2中ComboBox中的已知错误。我认为它已在SL 3中修复。
您可以通过执行以下操作来解决此问题:
从ComboBox继承
公共类MyComboBox:ComboBox
在OnApplyTemplate()方法中获取对ComboBox的“Popup”部分的引用
Popup thePopup = GetTemplateChild("Popup") as Popup;
FrameworkElement thePopupContent = thePopup.Child as FrameworkElement;
覆盖OnItemsChanged方法
在重写的OnItemsChagned方法中重置高度&amp;使用ClearValue(DP)方法在Popup上使用宽度依赖性属性。
thePopupContent.ClearValue(FrameworkElement.WidthProperty);
thePopupContent.ClearValue(FrameworkElement.HeightProperty);
您可以清除最大和最小高度&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
也可能会有所帮助,因为之前的值不再有效。