2009-05-14 3 views
8

Относящиеся к моему предыдущему вопросу: Binding ComboBox.SelectedItem in SilverlightСвязывание 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 временно имеет значение null, которое возвращается в мою модель, чего я действительно не хочу. Но привязка вообще не работает (что похоже на другую ошибку).

+0

Вы проверяете, действительно ли CurrentCommentary по-прежнему находится в списке CurrentVideo.Commentaries, потому что, если это не так, вы получите эту ошибку. –

+0

Я ввел конвертер в оба связанных свойства, чтобы проверить, действительно ли выбранный элемент находится в источнике items. Кажется, что проблема связана с изменениями ItemsSource. Это изменение приводит к тому, что SelectedItem становится нулевым. SelectedCommentary изменяет значение null, потому что это двусторонняя привязка. SelectedCommentary настроен на правильное значение для приложения, это значение определенно находится в ItemsSource. Ошибка. Если режим привязки не является TwoWay, ошибки нет, но тогда соответствующий элемент никогда не будет выбран. –

ответ

0

выпадающий является вполне управления SL глючит :-(

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

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

НТН Braulio

+0

Интересное сообщение, но это не похоже на мою проблему. Однако я узнал о DisplayMemberPath. Раньше я устанавливал новый DataTemplate только для отображения свойства элемента. –

0

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

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

Недавно я связался с проблемой около Gotcha when databinding a ComboBox in Silverlight.

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

+0

Использование UpdateLayout - хороший подход, но я дал ему шанс и все же закончил с той же ошибкой. Я получаю его при установке SelectedItem в коде или через привязку. –

+0

В образце вашего блога вы привязываетесь к свойству, где получатель динамически создает новый OC на get. Это изменит указатель, используемый привязкой ItemsSource каждый раз, когда будет оценен. Более устойчивым подходом было бы объявить OC и добавить к нему элементы. Кроме того, путем динамического построения OC , нет смысла даже использовать OC , вы также можете использовать Список . – markti

+0

Согласен, в конце концов, я перешел к подобной модели, однако это все равно ошибка, наблюдаемая при изменении источников предметов. –

1

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

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

13

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

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

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

Bad:

MyList = new ObservableCollection(); 

Хорошо:

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

2) Установите MyItem = нуль перед Клиринговый MyList

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

+0

Спасибо за это предложение @markti. У меня была такая же ошибка в моем приложении для Windows 8.1 Store, и это заставляло меня заниматься терапией. Интересным фактом является то, что я просто использовал тот же подход, который отлично работает в другом представлении, и приближается к тому, что элемент ItemsSource для ComboBox привязан к списку <>, а не ObservableCollection. Мне лучше вернуться и изменить его там. – Eddie

Смежные вопросы