2009-05-14 7 views
8

meiner vorherigen Frage Ähnliche: Binding ComboBox.SelectedItem in SilverlightBindung ComboBox.SelectedItem in Silverlight (mehr)

Ich habe eine ComboBox wie so gebunden:

regelmäßig
<ComboBox x:Name="PART_CommentaryList" 
    HorizontalAlignment="Left" 
    Margin="3" 
    ItemsSource="{Binding Path=CurrentVideo.Commentaries}" 
    SelectedItem="{Binding Path=CurrentCommentary, Mode=TwoWay}"> 

Sowohl die CurrentVideo und CurrentCommentary Eigenschaftsänderung. Nach ein paar Mal bekomme ich diesen Fehler:

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) 

Dies scheint wie ein ComboBox-Fehler für mich. Ich kann überprüfen, dass CurrentVideo vor CurrentCommentary geändert wird, daher sollte das ausgewählte Element immer ein Element sein, das sich in der Liste befindet.

Related, ich möchte wirklich nicht den Modus = TwoWay, denn wenn die ItemsSource geändert wird, ist das SelectedItem vorübergehend Null, die in meinem Modell zurückgesetzt wird, die ich eigentlich nicht möchte. Aber die Bindung funktioniert überhaupt nicht (das scheint ein anderer Fehler zu sein).

+0

Überprüfen Sie, ob der CurrentCommentary immer noch in der CurrentVideo.Commentaries-Liste aufgeführt ist. Wenn dies nicht der Fall ist, wird dieser Fehler angezeigt. –

+0

Ich habe einen Konverter in beide gebundenen Eigenschaften eingefügt, um zu prüfen, ob das ausgewählte Objekt tatsächlich in der Item-Quelle enthalten ist. Das Problem scheint zu sein: ItemsSource ändert sich. Diese Änderung bewirkt, dass SelectedItem null wird. SelectedCommentary wird auf null geändert, da es sich um eine bidirektionale Bindung handelt. SelectedCommentary wird von der App auf den richtigen Wert gesetzt, dieser Wert liegt definitiv innerhalb von ItemsSource. Fehler passiert. Wenn der Bindungsmodus nicht TwoWay ist, gibt es keinen Fehler, aber das richtige Element wird nie ausgewählt. –

Antwort

0

Combobox ist eine ziemlich Buggy SL Steuer :-(

In meinem Fall habe ich mit dem ausgewählten Elemente declarativa Bindung und nutzen Sie den fiesen Codierungsansatz ... hässlich, aber funktioniert.

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

HTH Braulio

+0

Interessante Post, aber das scheint nicht wirklich relevant für mein Problem. Ich habe jedoch etwas über DisplayMemberPath gelernt. Zuvor habe ich ein neues DataTemplate nur zum Anzeigen einer Eigenschaft des Elements festgelegt. –

0

ich war vor einer Weile das gleiche Problem bekommen und von dem, was ich kann es sagen, um einen Fehler in ComboBox ist, wenn der ItemSource geändert wird es ein Problem mit dem Layout hat und sc rollt schlecht.

Es gibt eine Arbeit, indem Sie ComboBox.UpdateLayout zwischen dem Festlegen der ItemSource und SelectedItem aufrufen.

Ich habe über das Problem vor einer Weile bei Gotcha when databinding a ComboBox in Silverlight gebloggt.

ich habe noch zu prüfen, ob das Problem in der Beta Silverlight 3 existiert noch

+0

Verwenden von UpdateLayout ist ein guter Ansatz, aber ich habe es geschossen und endete immer noch mit dem gleichen Fehler. Ich bekomme es, wenn ich SelectedItem im Code oder per Bindung einstelle. –

+0

Im Beispiel in Ihrem Blog binden Sie an eine Eigenschaft, bei der der Getter dynamisch ein neues OC on get erstellt. Dadurch wird der Zeiger, der von der ItemsSource-Bindung verwendet wird, bei jeder Auswertung geändert. Ein stabilerer Ansatz wäre, ein OC zu deklarieren und Elemente hinzuzufügen. Durch die dynamische Erstellung eines OC ist es auch nicht sinnvoll, ein OC zu verwenden. Sie können auch eine Liste verwenden. – markti

+0

Einverstanden, am Ende bin ich zu einem solchen Modell umgezogen, aber es ist immer noch ein Bug, auf den man achten sollte, wenn man die Elementquellen wechselt. –

1

Danke für die Vorschläge oben. In meiner Situation bin ich in der Lage, die "nukleare Option" zu wählen, dh - wenn das ausgewählte Element geändert werden muss, zerstöre ich die ComboBox vollständig, mache eine neue und setze ihr SelectedItem entsprechend.

Lächerlich, aber es funktioniert.

13

Dies ist ein Fehler im ComboBox-Steuerelement, der mit dem wechselnden Zeiger der ItemsSource-Bindung zu tun hat. Die Lösung, die ich gefunden habe, ist:

1) Binden Sie die ItemsSource immer an eine beobachtbare Sammlung und nie den Zeiger des OC zurück.

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

Bad:

MyList = new ObservableCollection(); 

Gut:

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

2) Stellen Sie MyItem = null, bevor Clearing MyList

In Ihrem Fall, dass Sie die Referenz der Liste ändern wenn Sie CurrentView ändern. Wenn SelectedItem nicht null ist, gibt es daher einen kurzen Zeitpunkt, in dem die ItemsSource zurückgesetzt wird, die Interna der ComboBox versuchen, das SelectedItem-Objekt in der neuen ItemsSource zu finden, aber das alte Objekt ist nicht vorhanden.

+0

Danke für diesen Vorschlag @markti. Ich hatte den gleichen Fehler in meiner Windows 8.1 Store App und es fuhr mich zur Therapie. Die interessante Tatsache ist, dass ich nur den gleichen Ansatz verwendet habe, der in einer anderen Ansicht perfekt funktioniert, Ansatz, bei dem die ItemsSource meiner ComboBox an eine List <> und nicht an eine ObservableCollection gebunden ist. Ich gehe besser zurück und ändere es auch dort. – Eddie