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 の前に変更されることを確認できるため、選択されたアイテムは常にリストにあるアイテムである必要があります。

関連して、ItemsSource が変更されると、SelectedItem が一時的に null になり、モデルに戻されるため、Mode=TwoWay は本当に必要ありません。これは実際には必要ありません。しかし、それ以外の場合、バインディングはまったく機能しません (これは別のバグのようです)。

4

4 に答える 4

13

これは、ItemsSourceのバインディングのポインターの変更に関係するComboBoxコントロールのバグです。私が見つけた解決策は次のとおりです。

1)常にItemsSourceを監視可能なコレクションにバインドし、OCのポインターをリセットしないでください。

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

悪い:

MyList = new ObservableCollection();

良い:

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

2)MyListをクリアする前に、MyItem=nullを設定します

あなたの場合、CurrentViewを変更するたびにリストの参照を変更しています。したがって、SelectedItemがnullでない場合、ItemsSourceがリセットされる瞬間があり、ComboBoxの内部は新しいItemsSourceでSelectedItemオブジェクトを見つけようとしますが、古いオブジェクトはそこにありません。

于 2009-05-21T18:28:47.970 に答える
0

Combobox は非常にバグのある SL コントロールです :-(.

私の場合、選択した項目の declalativa バインディングをあきらめて、厄介なコーディング アプローチを使用します...醜いですが動作します:

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

HTHブラウリオ

于 2009-05-14T21:48:41.173 に答える
0

私は少し前に同じ問題を抱えていましたが、ItemSource が変更されたときの ComboBox のバグであることがわかり、レイアウトに問題があり、スクロールがうまくいきません。

ItemSource と SelectedItem の設定の間に ComboBox.UpdateLayout を呼び出すことによる回避策があります。

少し前にGotcha で、Silverlight で ComboBox をデータバインドするときの問題についてブログを書きました。

問題が Silverlight 3 Beta にまだ存在するかどうかはまだ確認していません。

于 2009-05-14T21:49:15.540 に答える