2010-02-25 6 views
3

Je commence par WPF et la liaison, mais il y a un comportement étrange que je ne comprends pas.WPF Question de liaison

Exemple 1: Une forme WPF très simple, avec un seul combobox (nom = C) et le code suivant dans le constructeur:

public Window1() 
    { 
     InitializeComponent(); 

     BindingClass ToBind = new BindingClass(); 
     ToBind.MyCollection = new List<string>() { "1", "2", "3" }; 

     this.DataContext = ToBind; 

     //c is the name of a combobox with the following code : 
     //<ComboBox Name="c" SelectedIndex="0" ItemsSource="{Binding Path=MyCollection}" /> 
     MessageBox.Show(this.c.SelectedItem.ToString()); 
    } 

Pouvez-vous me expliquer pourquoi cela se bloque à cause de cela. c.SelectedItem étant NULL.

Je ... mais pas de problème, il est parce qu'il est dans le constructeur, METTONS le code dans l'événement formulaire Loaded:

 public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     BindingClass ToBind = new BindingClass(); 
     ToBind.MyCollection = new List<string>() { "1", "2", "3" }; 
     this.DataContext = ToBind; 
     MessageBox.Show(this.c.SelectedItem.ToString()); 
    } 

Même problème this.c.SelectedItem est nul ...

Remarque: Si je supprime la chose Messagebox, alors la liaison fonctionne très bien, j'ai la valeur dans la liste déroulante. C'est comme si "un peu" de temps était nécessaire après la définition du datacontext. Mais comment savoir quand la reliure sera faite?

Je vous remercie de votre aide.

Répondre

2

C'est parce que le selectionchanged n'a pas encore été déclenché, donc selecteditem est toujours null.

private void c_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    MessageBox.Show(this.c.SelectedItem.ToString()); 
} 

Si vous êtes nouveau sur WPF, je vous suggère d'aller voir le modèle MVVM. Il y a une vidéo d'introduction très agréable ici: http://blog.lab49.com/archives/2650

+0

Enfer, En fait, c'est encore plus que juste l'attribut selected, c'est-à-dire null. La zone de liste déroulante réagit comme si elle n'était pas du tout liée (les éléments étant également null). Était curieux parce que cela fonctionne dans Silverlight 3 – Fabian

+0

Oui, n'a pas pris la peine de vérifier que: P. Un peu bizarre que cela fonctionne dans silverlight mais pas dans wpf. Peut-être qu'ils ont une manière différente de charger les contrôles. J'ai vérifié OnContentRendered et MyCollection a été défini avant de rendre le contrôle lui-même. Je n'ai pas le temps de regarder plus loin mais le réflecteur .g est un excellent outil pour voir ce qui se passe dans le framework .net. Aidé m'a trouvé beaucoup de choses étranges avec WPF. Désolé pour la mauvaise réponse, mais j'espère que vous jetez un oeil à MVVM comme un très bon modèle pour développer des applications WPF. – Michael

+0

Tx vous Michael, je passe d'un projet de Silverlight 3 à WPF, au premier coup d'oeil ça semble assez facile, mais ils sont vraiment méchants d'étranges différences entre eux qui rendent la chose assez compliquée! :) – Fabian

0

Votre liaison se produit au cours de l'événement Window_Loaded mais elle n'est pas dessiné pour scren, donc il n'y a pas encore SelectedItem.

Vous devrez écouter l'événement PropertyChanged de votre Binding ou DataContext ou autre. Ensuite, OnPropertyChanged, affichez votre boîte de message

0

Tx pour le commentaire, il devrait être quelque chose comme ça, j'essaie cela, et que cela fonctionne:

BindingClass ToBind = new BindingClass(); 
    public Window1() 
    { 
     InitializeComponent(); 
     ToBind.MyCollection = new List<string>() { "1", "2", "3" }; 

     this.DataContext = ToBind; 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(this.c.SelectedItem.ToString()); 
    } 

Voici donc, même si ce n'est pas dessiné sur l'écran le selecteditem est déjà récupéré ... très étrange.