2009-05-14 3 views
8

내 앞의 질문에 관련 : Binding ComboBox.SelectedItem in Silverlight이 (더)

는 I는 콤보 상자과 같이 결합했다 :

<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는 필요하지 않습니다. 그러나 바인딩은 다르게 작동하지 않습니다 (다른 버그와 같음). .

+0

CurrentCommentary가 CurrentVideo.Commentaries 목록에 있는지 확인하고 있습니까? 그렇지 않은 경우이 오류가 발생합니다. –

+0

선택한 항목이 실제로 항목 소스에 있는지 여부를 검사하기 위해 두 바인드 속성에 변환기를 주입했습니다. 문제는 ItemsSource 변경 사항 인 것 같습니다. 이 변경으로 인해 SelectedItem은 null이됩니다. SelectedCommentary는 양방향 바인딩이므로 null로 변경됩니다. SelectedCommentary가 앱에 의해 적절한 값으로 설정되면이 값은 ItemsSource 내에 확실히 있습니다. 오류가 발생합니다. Y 인딩 모드가 TwoWay가 아니면 오류는 없지만 적절한 항목은 절대로 선택되지 않습니다. –

답변

0

콤보는 ... 내가 선택한 항목 declarativa 바인딩과 불쾌한 코딩 방법을 사용하여 포기 내 경우

:-(추한 꽤 버그 SL 컨트롤입니다하지만 작동합니다

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

HTH 브라 울 리오

+0

재미있는 게시물이지만 내 문제와 관련이없는 것 같습니다. DisplayMemberPath에 대해 배웠습니다. 이전에는 항목의 속성을 표시하기 위해 새로운 DataTemplate을 설정했습니다. –

0

내가 얼마 전에 같은 문제를 얻고 있었다 그리고 내가 무엇을 말할 수있는 것은 콤보 상자에서 문제의에서 ItemSource 그것이 레이아웃과 사우스 캐롤라이나에 문제가 변경 될 때 나쁘게 굴러 간다.

ItemSource와 SelectedItem을 설정하는 사이에 ComboBox.UpdateLayout을 호출하면 해결할 수 있습니다.

얼마 전에 문제에 대해 블로그 Gotcha when databinding a ComboBox in Silverlight에 블로깅했습니다. 나는 아직했습니다

문제가 여전히 실버 라이트 3 베타에서 위의 제안

+0

UpdateLayout을 사용하는 것은 좋은 접근 방법이지만, 한 번 시도해 보았지만 같은 오류가 발생했습니다. 코드 또는 바인딩을 통해 SelectedItem을 설정할 때 나타납니다. –

+0

블로그의 샘플에서 getter가 get 할 때 새로운 OC 을 동적으로 생성하는 속성에 바인딩됩니다. 이것은 평가 될 때마다 ItemsSource 바인딩이 사용하는 포인터를 변경합니다. 보다 안정적인 접근 방법은 OC 을 선언하고 항목을 추가하는 것입니다. 또한 OC 을 동적으로 구성하면 OC 을 사용하는 경우에도 List 을 사용할 수 있습니다. – markti

+0

동의했다, 결국 나는 그런 모델로 옮겼다. 그러나 그것은 여전히 ​​아이템 소스를 변경할 때 조심해야 할 버그 다. –

1

덕분에 존재하는지 여부를 확인합니다. 내 상황에서는 "핵 옵션"을 선택할 수 있습니다. 즉, 선택한 항목을 변경해야 할 때마다 ComboBox를 완전히 파괴하고 새 항목을 만들어 SelectedItem을 적절하게 설정합니다.

우스꽝 스럽지만 작동합니다.

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이 null이 아닌 경우 ItemsSource가 재설정되는 잠시 동안 ComboBox 내부에서 새 ItemsSource의 SelectedItem 개체를 찾으려고 시도하지만 이전 개체는없는 것입니다.

+0

이 제안에 감사드립니다. @markti. 내 Windows 8.1 Store 응용 프로그램에서 동일한 오류가 발생하여 치료를 위해 나를 몰고 왔습니다. 흥미로운 사실은 방금 다른 뷰에서 완벽하게 작동하는 동일한 접근 방식을 사용하여 ComboBox의 ItemsSource가 ObservableCollection이 아닌 List <>에 바인딩되는 방식입니다. 나는 다시 가서 거기에서도 그것을 변경하는 것이 좋다. – Eddie

관련 문제