La Liaison De Zone De Liste Déroulante.SelectedItem en Silverlight (plus)
Liées à ma question précédente: La Liaison De Zone De Liste Déroulante.SelectedItem en Silverlight
J'ai un ComboBox lié de la sorte:
<ComboBox x:Name="PART_CommentaryList"
HorizontalAlignment="Left"
Margin="3"
ItemsSource="{Binding Path=CurrentVideo.Commentaries}"
SelectedItem="{Binding Path=CurrentCommentary, Mode=TwoWay}">
À la fois la CurrentVideo et CurrentCommentary bien changer régulièrement. Quelques temps après, je reçois cette erreur:
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)
Cela semble être une zone de liste déroulante bug pour moi. Je peux vérifier que CurrentVideo modifications avant de CurrentCommentary, de sorte que l'élément sélectionné doit toujours être un élément qui est dans la liste.
Liés, je ne veux vraiment pas le Mode=TwoWay, parce que quand le ItemsSource est modifié, le SelectedItem est temporairement null, qui est de retour dans mon modèle, je n'ai pas vraiment envie. Mais la liaison ne fonctionne pas à tous les autres (ce qui semble être un autre bug).
J'ai injecté un convertisseur vers les deux propriétés liées afin de vérifier si l'élément sélectionné est en effet dans la itemssource. La question semble être: ItemsSource changements. Ce changement provoque SelectedItem à devenir nulle. SelectedCommentary des changements à la valeur null, car c'est une liaison bidirectionnelle. SelectedCommentary est sur la bonne valeur par l'application, cette valeur est certainement à l'intérieur de ItemsSource. Erreur se produit. Si le mode de fixation n'est pas Bidirectionnelle, il n'y a pas d'erreur, mais alors le bon élément n'est jamais sélectionné.
OriginalL'auteur Josh Santangelo | 2009-05-14
Vous devez vous connecter pour publier un commentaire.
C'est un bug dans le contrôle ComboBox qui a à voir avec l'évolution du pointeur de la ItemsSource de liaison. La solution que j'ai trouvé est:
1) Toujours lier la ItemsSource à une collection observable et ne jamais réinitialiser le pointeur de l'OC.
Mauvais:
Bon:
2) Définir MyItem = null, avant de l'effacer Maliste
Dans votre cas, vous modifiez la référence de la Liste à chaque fois que vous changez de Lors de. Par conséquent, si SelectedItem n'est pas null, il y a un bref moment dans le temps où l'ItemsSource est en cours de réinitialisation, l'intérieur de la zone de liste déroulante sont de tenter de localiser la SelectedItem objet dans la nouvelle ItemsSource mais l'ancien objet n'est pas là.
OriginalL'auteur markti
Merci pour les suggestions ci-dessus. Dans ma situation, je suis en mesure d'aller pour le "option nucléaire", qui est -- à chaque fois que l'élément sélectionné doit changer, j'ai complètement détruire la zone de liste déroulante, en faire une nouvelle, et de définir sa SelectedItem de façon appropriée.
Ridicule, mais ça marche.
OriginalL'auteur Josh Santangelo
Zone de liste déroulante est un buggy de contrôle SL :-(.
Dans mon cas, j'ai donné à l'élément sélectionné declarativa de liaison et d'utiliser le méchant approche de codage... laid mais qui fonctionne:
http://blogs.msdn.com/mikehillberg/archive/2009/03/26/implementing-selectedvalue-with-the-silverlight-combobox.aspx
HTH
Braulio
OriginalL'auteur Braulio
J'avais la même question il y a un moment et à partir de ce que je peux dire c'est un bug dans la zone de liste déroulante quand la ItemSource est changé, il a un problème avec la mise en page et parchemins mal.
Il y a un travail autour de en composant ComboBox.UpdateLayout entre les ItemSource et SelectedItem.
J'ai blogué sur le problème il y a longtemps à Gotcha lors de la liaison de données d'une zone de liste déroulante dans Silverlight.
Je n'ai pas encore vérifier si le problème existe toujours en Silverlight 3 Beta
Dans l'échantillon de votre blog, vous êtes de liaison à une propriété où la lecture est de créer dynamiquement une nouvelle OC<T> sur obtenir. Cela va changer le pointeur utilisé par le ItemsSource de liaison à chaque fois qu'il est évalué. Plus stable approche serait de déclarer un OC<T>, et l'ajout d'éléments. Aussi, la dynamique de la construction d'un OC<T>, il n'y a pas de point dans même à l'aide d'un OC<T> vous pourriez aussi bien utiliser une List<T>.
D'accord, en fin de compte, j'ai déménagé à un modèle comme ça, mais il est encore un bug à surveiller lors de la modification de l'élément de sources.
OriginalL'auteur Nigel Sampson