WPF ComboBox SelectedItem défini sur Null sur le commutateur TabControl
J'ai un problème simple dans mon application WPF qui m'a frapper ma tête sur la table. J'ai un TabControl, où chaque TabItem est une Vue générée pour un ViewModel à l'aide d'un DataTemplate similaire à ceci:
<DataTemplate DataType="{x:Type vm:FooViewModel}">
<vw:FooView/>
</DataTemplate>
FooView contient une zone de liste déroulante:
<ComboBox ItemsSource="{Binding Path=BarList}" DisplayMemberPath="Name" SelectedItem="{Binding Path=SelectedBar}"/>
et FooViewModel contient une Propriété simple: public Bar SelectedBar { get; set; }
. Mon problème est que lorsque j'ai mis la valeur de ma zone de liste déroulante, passer à un autre onglet, puis revenir, la zone de liste déroulante est à nouveau vide. Si j'ai mis un point d'arrêt sur la définition pour mon bien, je vois que le bien est affecté à null
lorsque je passe à un autre onglet.
De ce que je comprends, lorsqu'un onglet est activé, il est retiré de la VisualTree - mais pourquoi est-il la définition de mon ViewModel de la propriété null
? C'est ce qui rend très difficile pour moi de tenir un état persistant, et la vérification de value != null
ne semble pas être la bonne solution. Quelqu'un peut-il de jeter un peu comme sur cette situation?
Edit: La pile d'appel au poseur de point d'arrêt ne montre [Code Externe] - pas de conseils.
source d'informationauteur bsg
Vous devez vous connecter pour publier un commentaire.
nous viens de tomber sur le même problème. Nous avons trouvé une entrée de blog décrivant le problème. Il semble que c'est un bug dans WPF et il y a une solution:
Spécifiez le SelectedItem liaison avant la ItemsSource de la liaison et le problème devrait avoir disparu.
Le lien vers l'article du blog:
http://www.metanous.be/pharcyde/post/Bug-in-WPF-combobox-databinding.aspx
Mon application utilise avalondock & prims et avait ce problème exact. Je a même pensé avec BSG, lorsque nous sommes passés de l'onglet ou le contenu du document dans MVVM application, les contrôles listview+zone de, zone de liste déroulante est retiré de VisualTree. J'ai buggé et a vu la plupart des données de eux a été réinitialisé à la valeur null comme itemssource selecteditem .. mais selectedboxitem était encore courant de valeur.
Une approche du modèle, de vérifier sa valeur est null alors de retour comme ceci:
Mais cette approche ne peut résoudre assez bonnes dans la première liaison. je veux dire,
comment nous allons, si vous voulez lier SelectedEmployee.Office de zone de liste déroulante, n'est pas le bon
si la vérification en événement propertyChanged de SelectedEmployee modèle.
Fondamentalement, nous ne voulons pas que sa valeur est réinitialisée null, garder son pré-valeur. J'ai trouvé une nouvelle solution
de manière cohérente. En utilisant la propriété attachée, j'ai créé KeepSelection un-Pro, type bool, pour Sélecteur de contrôles, ainsi tous ses hérité de sucer comme listview, combobox...
Final, j'utilise cette approche simplement en xaml:
Mais, selecteditem ne sera jamais nulle si le sélecteur est itemssource a des éléments. Il peut affecter
certains contexte particulier.
Espère que ça aide.
Heureux conding! 😀
longsam
Généralement, j'utilise SelectedValue au lieu de SelectedItem. Si j'ai besoin de l'objet associé à la SelectedValue puis-je ajouter un champ de recherche contenant ce à l'objet cible (comme je l'ai utiliser des modèles T4 de gen mon viewmodel, ce qui tend à être dans une classe partielle). Si vous utilisez un nullable propriété pour stocker les SelectedValue puis vous rencontrez le problème décrit ci-dessus, toutefois si contraignant la SelectedValue à un non nullable valeur (comme un int), puis le WPF liaison moteur de jeter la valeur null comme inappropriés pour la cible.
Edit:
Ci-dessous œuvres de trucs (j'espère...); j'ai développé, c'est parce que j'ai suivi la
SelectedItems
itinéraire décrit sur le MVVM Lite page. Cependant, pourquoi aurais - je besoin de s'appuyer surSelectedItems
? L'ajout d'unIsSelected
propriété de mes Articles (comme le montre ici) conserve automatiquement les éléments sélectionnés (court de la mentionné cavet dans le lien ci-dessus). En fin de compte, beaucoup plus facile!Premier Post:
ok - c'était un morceau de travail; j'ai un multi-colonne ListView avec SelectionMode="Extension", ce qui rend le truc assez complexe. Mon point de départ est en invoquant tabItems des espaces de travail similaires, comme l'décrire ici.
J'ai fait en sorte que, dans mon ViewModel, je sais que quand un onglet de l'élément (espace de travail) est active. (C'est un peu similaire à ici) - bien sûr, quelqu'un doit initalize SelectedWorkspace premier.
Cela m'a permis de mettre à jour le ViewModel éléments sélectionnés uniquement si l'onglet de l'élément (espace de travail) a été réellement active. Donc, mon ViewModel les éléments sélectionnés de la liste est préservée, même au niveau de l'onglet de l'élément efface de la liste.SelectedItems. Dans le ViewModel:
Dernier, lors de la tabItem ai ré-activé, j'ai accroché jusqu'à la "Chargé" de l'événement et a rétabli la SelectedItems. Ceci est fait dans le code-behind de la Vue. (Noter que, bien que mon ListView a plusieurs colonnes, l'une sert de la clé, les autres sont pour information seulement. le ViewModel selectedItems liste ne garde la clé. Sinon, la comparaison ci-dessous serait plus complexe):
si vous poursuivez async sélection dans WPF, puis le retirer IsSynchronizedWithCurrentItem="True" à partir de la zone de liste déroulante, veuillez consulter le document sur IsSynchronizedWithCurrentItem:
aussi takecare la liaison
la première utilisation SelectedItem
puis ItemsSource
réf.:
http://social.msdn.microsoft.com/Forums/vstudio/en-US/fb8a8ad2-83c1-43df-b3c9-61353979d3d7/comboboxselectedvalue-is-lost-when-itemssource-is-updated?forum=wpf
http://social.msdn.microsoft.com/Forums/en-US/c9e62ad7-926e-4612-8b0c-cc75fbd160fd/bug-in-wpf-combobox-data-binding
- Je résoudre mon problème à l'aide de la
Une fois, j'ai eu un problème similaire. Il semble que la zone de liste déroulante perd de l'élément sélectionné dans VisibilityChanged événement. Workarround est d'effacer la liaison avant cela se produit, et de le remettre au retour. Vous pouvez également essayer de définir la Liaison à la Mode=TwoWay
Espérons que cela aide
Jan
J'ai eu le même problème et résolu avec la méthode suivante attaché à la zone de liste déroulante DataContextChanged-Événement:
Donc, chaque fois que vous souhaitez supprimer le datacontext de la zone de liste déroulante, l'ancien datacontext est posée de nouveau.
Chaque fois que vous modifiez l'Onglet actif de votre TabControl, la zone de liste déroulante sera supprimé de votre VisualTree et si vous revenez à l'un avec vos zone de liste déroulante. Si la combo est retiré de la VisualTree, aussi le DataContext est définie sur null.
Ou vous utilisez une classe, qui ont mis en place une telle fonctionnalité:
Je pense que le problème peut être que vous n'en racontant la liste déroulante lors de la lier à la source de l'. Essayez ceci:
J'ai eu ce même problème lors du défilement d'une virtualisation de
DataGrid
qui contientComboBox
es. À l'aide deIsSynchronizedWithCurrentItem
n'a pas de travail, ni modification de l'ordre de laSelectedItem
etItemsSource
liaisons. Mais ici, c'est un vilain hack qui semble fonctionner:Premier à donner votre
ComboBox
unx:Name
. Ce doit être dans le code XAML pour un contrôle avec un seulComboBox
. Par exemple:Puis ajouter ces deux gestionnaires d'événements dans votre code:
Vous pouvez utiliser le framework MVVM Catel et le catel:TabControl élément, il ce problème est déjà résolu.
Il suffit de ne pas permettre à votre ViewModel de la propriété d'être changé si la valeur est nulle.
.