8

与我之前的问题相关:在 Silverlight 中绑定 ComboBox.SelectedItem

我有一个像这样绑定的 ComboBox:

<ComboBox x:Name="PART_CommentaryList" 
    HorizontalAlignment="Left" 
    Margin="3" 
    ItemsSource="{Binding Path=CurrentVideo.Commentaries}" 
    SelectedItem="{Binding Path=CurrentCommentary, Mode=TwoWay}">

CurrentVideo 和 CurrentCommentary 属性都会定期更改。几次后,我收到此错误:

Category: ManagedRuntimeError       
Message: System.ArgumentException: Value does not fall within the expected
   range.
   at MS.Internal.XcpImports.MethodEx(IntPtr ptr, String name, 
       CValue[] cvData)
   at MS.Internal.XcpImports.MethodPack(IntPtr objectPtr, String methodName, 
       Object[] rawData)
   at MS.Internal.XcpImports.UIElement_TransformToVisual(UIElement element, 
       UIElement visual)
   at System.Windows.UIElement.TransformToVisual(UIElement visual)
   at System.Windows.Controls.Primitives.Selector.IsOnCurrentPage(
       Int32 index, Rect& itemsHostRect, Rect& listBoxItemRect)
   at System.Windows.Controls.Primitives.Selector.ScrollIntoView(
       Int32 index)
   at System.Windows.Controls.Primitives.Selector.SetFocusedItem(
       Int32 index, Boolean scrollIntoView)
   at System.Windows.Controls.ComboBox.PrepareContainerForItemOverride(
       DependencyObject element, Object item)
   at System.Windows.Controls.ItemsControl.UpdateContainerForItem(
       Int32 index)
   at System.Windows.Controls.ItemsControl.RecreateVisualChildren()
   at System.Windows.Controls.ItemsControl.RecreateVisualChildren(
       IntPtr unmanagedObj)

这对我来说似乎是一个 ComboBox 错误。我可以验证 CurrentVideo 在 CurrentCommentary 之前更改,因此所选项目应始终是列表中的项目。

相关,我真的不想要 Mode=TwoWay,因为当 ItemsSource 更改时,SelectedItem 暂时为空,这会在我的模型中重新设置,而我实际上并不想要。但是绑定根本不起作用(这似乎是另一个错误)。

4

4 回答 4

13

这是 ComboBox 控件中的一个错误,它与 ItemsSource 绑定的更改指针有关。我找到的解决方案是:

1) 始终将 ItemsSource 绑定到可观察集合,并且从不重置 OC 的指针。

<ComboBox ItemsSource="{Binding MyList}" SelectedItem="{Binding MyItem}" />

坏的:

MyList = new ObservableCollection();

好的:

MyList.Clear();
MyList.AddRange(...);

2) 在清除 MyList 之前设置 MyItem = null

在您的情况下,每当您更改 CurrentView 时,您都会更改列表的引用。因此,如果 SelectedItem 不为空,则会有一小段时间在重置 ItemsSource,ComboBox 的内部试图在新的 ItemsSource 中定位 SelectedItem 对象,但旧对象不存在。

于 2009-05-21T18:28:47.970 回答
1

感谢以上建议。在我的情况下,我可以选择“核选项”,即每当需要更改所需的项目时,我都会完全销毁组合,制作新的组合,并适当地设置其SelectedItem。

荒谬,但它有效。

于 2009-05-14T23:05:24.107 回答
0

Combobox 是一个非常有问题的 SL 控件 :-(。

就我而言,我放弃了所选项目 declarativa 绑定并使用讨厌的编码方法......丑陋但有效:

http://blogs.msdn.com/mikehillberg/archive/2009/03/26/implementing-selectedvalue-with-the-silverlight-combobox.aspx

HTH布劳里奥

于 2009-05-14T21:48:41.173 回答
0

不久前我遇到了同样的问题,据我所知,这是 ComboBox 中的一个错误,当 ItemSource 发生更改时,它的布局有问题并且滚动很糟糕。

通过在设置 ItemSource 和 SelectedItem 之间调用 ComboBox.UpdateLayout 可以解决此问题。

不久前,当在 Silverlight 中对 ComboBox 进行数据绑定时,我在 Gotcha上写了一篇关于这个问题的博客。

我尚未验证 Silverlight 3 Beta 中是否仍然存在问题

于 2009-05-14T21:49:15.540 回答