私の前の質問に関連する: 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 は本当に必要ありません。これは実際には必要ありません。しかし、それ以外の場合、バインディングはまったく機能しません (これは別のバグのようです)。