2010-12-12 11 views
1

J'ai rencontré un problème J'ai été surpris de ne pas trouver de discussion sur (sauf WPF MVVM ComboBox SelectedItem or SelectedValue not working peut-être).Lier SelectedItem comme la liaison de ItemsSource n'est pas terminée

J'ai un formulaire MVVM qui a 2 cteurs, l'un est pour "création d'un nouvel article", l'autre est pour "modification d'article". J'ai une liste déroulante qui représente l'une des propriétés de l'élément.

Dans la modification ctor, la propriété liée à ItemsSource est initialisée, puis la propriété liée à SelectedItem est définie. Mais rien n'est sélectionné dans l'interface utilisateur, sauf si je retarde (même minuscule) l'ensemble SelectedItem.

Comment puis-je résoudre ce problème? Je ne peux décemment pas garder un minuteur avec un intervalle totalement aléatoire pour résoudre le problème: D

Merci pour votre aide

+0

Pouvez-vous essayer avec SelectedIndex? Cela a fonctionné pour moi dans le passé. – Kugel

+0

J'ai suivi votre suggestion et essayé ceci, mais le problème est exactement le même: il affecte seulement l'élément sélectionné dans l'interface utilisateur si un peu retardé. –

Répondre

0

Il semble que la façon élégante pour assurer la ItemsSource est initialisé avant mon l'objet SelectedItem de VM doit avoir la source de liaison de ItemsSource (quelle qu'elle soit) déclarée dans mes ressources d'affichage. Je suis sûr que quelqu'un peut me conduire à la lumière maintenant que j'ai signalé cela.

J'ai essayé avec une CollectionViewSource mais je n'ai pas trouvé le moyen d'utiliser sa fonction Filter sans casser le pattern MVVM. De plus je ne sais pas comment re-lever le filtre comme je le faisais avec ICollectionView.Filter (les éléments filtrés dépendent d'une autre sélection de combobox, rien de vraiment fantaisiste). Peut-être que la ressource déclarée dans la vue et utilisée comme ItemsSource ne doit pas nécessairement être un CVS, je recherche des suggestions ici.

--Edit-- J'ai découvert que la solution IsSynchronizedWithCurrentItem = "True" répandue sur tout le web fonctionne réellement. J'ai été induit en erreur parce qu'il n'a pas résolu mon problème au premier essai en raison d'un SelectedValuePath restant qui n'était plus utilisé sur mon contrôle.

0
public MyViewModel() 
{ 
    this.Items = ...; 
    //this.SelectedItem = ...; 

    // select in separate message so that the ItemsSource has definitely been set 
    this.Dispatcher.BeginInvoke(delegate 
    { 
     this.SelectedItem = ...; 
    }); 
} 
+0

Ça ne marche pas pour moi. Avez-vous déjà travaillé sur un cas similaire? –