2010-08-18 9 views
2

Pour une raison quelconque, je dois initialiser les éléments ListBox derrière le code, la raison est trop compliquée à dire. Le LoadFamily() est appelé pendant l'affichage de WPF UserControl.Comment créer ListBoxItem derrière le code

public void LoadFamily() 
{ 
    DataTemplate listItemTemplate = this.FindResource("ManDataTemplate") as DataTemplate; 

    foreach (Person man in family) 
    { 
     ListBoxItem item = new ListBoxItem(); 

     item.DataContext = man; 
     item.ContentTemplate = listItemTemplate; 
     // other initialize for item object 
     this.ActivityList.Items.Add(item); 
    } 
} 

Dans mon fichier xmal, je définis un DataTemplate. Mais le ListBox ne contient que le bloc de texte vide, le nom de la personne ne s'affiche pas. Je ne sais pas pourquoi, peut-être que la liaison de données est erronée, mais comment le faire derrière le code.

Merci pour votre aide! (WPF 3.5 ou 4.0)

///////////////////////////////////// //////////////////////

Merci pour votre aide. J'ai trouvé où j'avais tort. Je ne devrais pas ajouter ListBoxItem dans ActivityList.Items, l'un est UIElement, l'autre est> DataCollection. Ils sont deux choses différentes.

je devrais modifier le code comme suit:

foreach (Person man in family) 
{ 
    this.ActivityList.Items.Add(man); 
    ListBoxItem item = this.ActivityList.ItemContainerGenerator.ContainerFromItem(man) as ListBoxItem; 
    item.ContentTemplate = listItemTemplate; 
    // other initialize for item object 
} 

Répondre

0

Il peut y avoir une erreur de liaison. C'est la raison pour laquelle le bloc de texte est vide. Vérifiez la fenêtre de sortie de VisualStudio, il affichera les erreurs de liaison si elles existent.

HTH

+0

Après avoir vérifié la sortie, j'ai découvert où j'avais tort. Ma question, merci. –

1

je ne vois pas l'avantage de créer les listboxitems manuellement. Réglez simplement la ItemsSource de la Listbox à la liste de la personne (famille).

+0

L'avantage est caché dans // autre initialize pour l'objet item, que je commente. Il y a trop de code là-dedans. :( –

+1

Je pense toujours qu'il est préférable de définir la ItemsSource de la ListBox à la liste, puis utilisez simplement votre datatemplate du XAML.Il utilisera automatiquement le DataContext correct pour chaque Item et la propriété Name sera lue –

+0

J'ai essayé comme vous l'avez dit, cela m'a pris du temps, je dois convertir beaucoup de code en xmal, ce qui est trop difficile à comprendre pour les autres –

Questions connexes