WPF ComboBox SelectedItem
Ok travaillé avec WPF pour un moment, mais j'ai besoin d'aide.
J'ai un ComboBox
comme ci-dessous:
<TabControl>
<TabItem Header="1">
<ComboBox ItemsSource="{Binding MyList}" SelectedItem="{Binding MyListSelection}"/>
</TabItem>
<TabItem Header="2"/>
</TabControl>
Chaque fois que je m'éloigne de l'onglet 1, puis revenir à la sélection est supprimée. Je crois que la raison est que les contrôles sont détruits lorsqu'ils passent hors de portée, puis de nouveau dans. Mais dans le processus de la SelectedItem devient nulle, ce qui n'est pas vraiment ce que l'utilisateur veut, c'est un événement en raison de l'INTERFACE utilisateur du cycle de vie.
Alors je me demandais quelle est la meilleure route à prendre? Je suis en train de construire cette application avec MVVM j'ai donc pu ignorer un ensemble d'appel sur le MyListSelection Bien dans mon ViewModel mais j'ai ComboBoxes tous sur la place et n'aime pas la modification de mon ViewModel pour ce que je considère comme un bug de WPF.
J'ai pu de sous-classe WPF ComboBox, mais il n'y a pas de SelectedItemChanging cas je ne peux qu'ajouter un gestionnaire lorsque SelectedItem changé.
Des idées?
Mise à JOUR:
Bon, après avoir battu ma tête contre le mur, j'ai trouvé pourquoi mon problème n'a pas pu obtenir de la reproduction. Si la liste type d'élément est une classe pour une raison quelconque, le SelectedItem est défini par WPF à null, mais si c'est un type de la valeur qu'il ne l'est pas.
voici ma classe de test(VMBase est juste une classe abstraite qui implémente INotifyPropertyChanged):
public class TestListViewModel : VMBase
{
public TestListViewModel()
{
TestList = new List<TestViewModel>();
for (int i = 0; i < 10; i++)
{
TestList.Add(new TestViewModel(i.ToString()));
}
}
public List<TestViewModel> TestList { get; set; }
TestViewModel _SelectedTest;
public TestViewModel SelectedTest
{
get { return _SelectedTest; }
set
{
_SelectedTest = value;
OnPropertyChanged("SelectedTest");
}
}
}
public class TestViewModel : VMBase
{
public string Name {get;set;}
}
Donc quand je change de TestList de type int et faire l'aller-retour entre les onglets SelectedItem reste le même. Mais lorsqu'il est de type TestViewModel
SelectedTest obtient la valeur null lorsque l'tabitem devient flou.
Ce qu'il se passe?
OriginalL'auteur Jose | 2010-01-28
Vous devez vous connecter pour publier un commentaire.
J'ai exactement le même problème, et jusqu'à présent je ne pouvais pas comprendre ce qu'est le problème. Je l'ai testé dans 4 machines différentes avec le même OS, .Version Net et les spécifications matérielles et pourrait reproduire le problème dans deux d'entre eux, dans les autres, a très bien fonctionné.
La solution de contournement que j'ai pu trouver qui fonctionne pour moi est de définir les SelectedItem de liaison avant la ItemsSource. Étrangement, si je suis ce schéma, tout fonctionne comme prévu.
Cela dit, vous avez juste à faire ce qui suit:
OriginalL'auteur Eduardo Laranjeira
Je voudrais vous recommandons de vérifier les liaisons. Si quoi que ce soit d'autre dans votre application est en train de changer l'élément sélectionné ou de la source des éléments, alors votre de liaison de casser. Vous pouvez également regarder dans Visual Studio à la fenêtre de sortie pour voir si il y a des erreurs.
OriginalL'auteur Alex B
Je pense que vous avez peut-être manque ici est une liaison Bidirectionnelle sur le SelectedItem. Lorsque vous liez votre ViewModel de la classe qui contient la Maliste(lié ItemsSource) et MyListSelection(Lien à SelectedItem dans votre Cas) aura toujours ces informations, même si vous êtes allé à onglets différents. Ainsi, lorsque vous revenez à l'Onglet de la MyListSelection va lier à la ComboBoc.SelectedItem de nouveau et vous serez bon. Essayez ceci et laissez-moi savoir.
OriginalL'auteur Jobi Joy
ÉDITÉ après le changement de l'OP.
Bonjour José, je suis incapable de reproduire l'erreur que vous mentionnez. Si votre hypothèse sur le Contrôle doit être détruit, c'est mal. La zone de liste déroulante se comporte comme prévu avec le code derrière ci-dessous même si elle est maintenant à l'aide d'un type de référence. Autre pièce de votre code doit coup de pied dans quand vous changez TabItems.
OriginalL'auteur Dabblernl
Je pense que cela pourrait être résolu avec un simple null vérifier.
C'est parce que la zone de liste déroulante a tendance à réinitialiser son SelectedIndex lors de leur recyclage. Cette simple null check va l'obliger à relier à la dernière élément valide.
En effet, cela pourrait être tout à fait ennuyeux, mais une fois de plus avoir à lever la propriété a changé de même sur chaque propriété est également gênant. WPF est loin d'être parfait. GL
Ce n'est pas toujours acceptable dans la mesure où les valeurs null, parfois des valeurs valides au sein d'une collection. Également qu'en cas où la propriété est en fait une propriété de dépendance? Alors que vous auriez à obtenir en regardant le Contraindre et le Changement des événements de notification pour faire quelque chose de semblable, ce qui est un gâchis. À mon avis, ce n'est vraiment pas une solution acceptable en général.
OriginalL'auteur Tri Q Tran
J'ai eu exactement le même problème avec un type de référence dans ma liste. La solution était de remplacer Equals() dans mon TestViewModel de sorte que WPF serait capable de faire une valeur de contrôle d'égalité (au lieu d'une vérification des références) entre les objets, afin de déterminer lequel est le SelectedItem. Le mien est arrivé d'avoir un champ ID qui est vraiment l'élément d'identification d'une TestViewModel.
OriginalL'auteur marinade
Ce comportement par la zone de liste déroulante, devrait être mis en œuvre par le compilateur dans un meilleur mode qu'il est... c'est à dire le compilateur doit vérifier et voir si le type de la ItemsSource et le type de référence valeur de la propriété SelectedItem est lié à la volonté de TOUJOURS retourner la valeur qui est comparable
Il faut avertir que vous pourriez envisager de substitution de la Equals() et GetHashCode() méthodes...
Perdu beaucoup de temps sur ce sujet aujourd'hui !!
OriginalL'auteur Greg Foote