Связывание ComboBox.SelectedItem в Silverlight (подробнее) - PullRequest
8 голосов
/ 14 мая 2009

Относится к моему предыдущему вопросу: Привязка ComboBox.SelectedItem в Silverlight

У меня есть 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, потому что, когда изменяется ItemSource, SelectedItem временно становится нулевым, что возвращается в мою модель, чего я на самом деле не хочу. Но в противном случае привязка не работает вообще (что похоже на еще одну ошибку).

Ответы [ 4 ]

13 голосов
/ 21 мая 2009

Это ошибка в элементе управления ComboBox, связанная с изменяющимся указателем привязки ItemsSource. Решение, которое я нашел, заключается в следующем:

1) Всегда связывайте ItemsSource с наблюдаемой коллекцией и никогда не сбрасывайте указатель OC.

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

Bad:

MyList = new ObservableCollection();

Хорошо:

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

2) Установите MyItem = null перед очисткой MyList

В вашем случае вы меняете ссылку на Список при каждом изменении CurrentView. Поэтому, если SelectedItem не равен NULL, существует короткий момент времени, когда сбрасывается ItemsSource, внутренние компоненты ComboBox пытаются найти объект SelectedItem в новом ItemsSource, но старого объекта там нет.

1 голос
/ 15 мая 2009

Спасибо за предложения выше. В моей ситуации я могу использовать «ядерную опцию», а именно: всякий раз, когда необходимо изменить выбранный элемент, я полностью уничтожаю ComboBox, создаю новый и соответствующим образом устанавливаю его SelectedItem.

Смешно, но работает.

0 голосов
/ 15 мая 2009

Некоторое время назад я получал ту же проблему, и, насколько я могу судить, это ошибка в ComboBox, когда ItemSource изменен, он имеет проблему с макетом и плохо прокручивается.

Существует обходной путь, вызывающий ComboBox.UpdateLayout между установкой ItemSource и SelectedItem.

Некоторое время назад я писал об этой проблеме на Понятно, когда связываю данные ComboBox в Silverlight .

Мне еще предстоит проверить, существует ли проблема в Silverlight 3 Beta

0 голосов
/ 15 мая 2009

Combobox - довольно глючный элемент управления SL: - (.

В моем случае я отказался от привязки к выбранному элементу декларативно и использовал неприятный подход к кодированию ... некрасиво, но работает:

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

НТН Braulio

...