2009-09-08 5 views
0

J'ai une zone de liste qui nécessite au moins un ComboBox. Je ne pouvais pas trouver un moyen de placer le ComboBox dans le ItemTemplate que j'utilise.Silverlight: Comment lier dynamiquement une zone de liste déroulante dans un ItemTemplate ListBox?

... 
<DataTemplate x:Key="parts_template"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock .../> 
    <ComboBox .../> 
    </StackPanel> 
</DataTemplate> 

... 
<ListBox x:Name="lb_parts" ItemTemplate="{StaticResource parts_template}" .../> 
... 

Comment liez-ComoBox dans le DataTemplate à un ObservableCollection dans le code derrière?

+0

Votre code ne passe pas par - pouvez-vous résoudre ce problème? –

+0

Correction du code. Nécessaire d'ajouter 4 indentations d'espace. – James

Répondre

3

Une autre chose que vous pourriez try est l'abonnement de l'événement Loaded sur le ComboBox. Ensuite, vous pouvez définir le ComboBox.ItemsSource dans le EventHandler à MyObservableCollection.

Jetez un oeil

XAML:

<DataTemplate x:Key="parts_template"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock .../> 
    <ComboBox Loaded="ComboBox_OnLoaded"> 
     <!-- ComboBox ItemTemplate --> 
    </ComboBox> 
    </StackPanel> 
</DataTemplate> 

C# Code Derrière:

private void ComboBox_OnLoaded(object sender, EventArgs e) 
{ 
    ((ComboBox)sender).ItemsSource = MyObservableCollection; 
} 
+0

Cela devrait fonctionner pour un scénario simple où vous avez la collection pour la source de l'élément ne change pas pendant la durée de vie de la page. Le problème est que l'événement Loaded est déclenché pour chaque élément de la zone de liste. Je dois appeler le serveur pour remplir la collection. Étant donné que les données utilisées dans la zone de liste déroulante dépend d'un autre champ sur l'écran et lorsque l'utilisateur modifie la valeur, j'ai besoin de modifier le contenu de cette liste déroulante. Cela signifie que le nombre d'appels au serveur est le même que le nombre d'éléments dans la zone de liste même si je ferais le même appel pour le même contenu. – James

+0

Quand appelez-vous le serveur pour remplir ObservableCollection. Dans mon exemple ci-dessus, il s'agit simplement de définir la zone ItemsBox ComboBox dans ObservableCollection. Chaque fois que vous choisissez de mettre à jour le Colletion n'a pas d'importance puisque le ComboBox sera informé de tous les changements et refléter cela dans leurs articles. Pour le moment, ils partagent tous le même ObservableCollection - si ce n'est pas ce que vous voulez, alors cette solution ne fonctionnera pas pour vous, pour les raisons que vous avez indiquées. Espérons que cela a du sens. – Eoinii

+0

Oui, ça a marché. Définissez la collection une fois lorsque l'autre champ a changé et affectez simplement la collection dans l'événement Loaded. J'aimerais pouvoir me référer à un autre modèle dans le xaml. – James

0

Bon, voici comment vous pouvez ajouter un ComboBox à la ListBox dans le code derrière.

Créer un ComboBox

ComboBox x = new ComboBox(); 

Si vous avez une source de données qui renseigne le ComboBox alors vous pouvez simplement lier cette

x.ItemsSource = e.Result; 

Si vous ne le faites pas et que vous voulez ajouter manuellement des éléments à la zone de liste déroulante :

ComboBoxItem y = new ComboBoxItem(); 

Définissez le contenu de l'élément sur ce que vous voulez afficher dans la zone de liste déroulante

y.Content = "Hello"; 

Maintenant, tout ce qui reste, est d'ajouter le ComboBoxItem à la zone de liste déroulante (uniquement si vous créez les éléments manuellement), puis le ComboBox ListBox

x.Items.Add(y); 

//testing is my ListBox 
testing.Items.Add(x); 
+0

N'ont pas essayé ceci mais je préférerais ne pas créer la zone de liste déroulante elle-même dans le code. – James

0

Vous devriez être en mesure de définir le contexte de données à la liste elle-même

lb_Parts.DataContext=myCollection;

Ensuite, vous devriez être en mesure de se lier à elle dans le modèle

<DataTemplate x:Key="parts_template"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock .../> 
    <ComboBox ItemSource={Binding}/> 
    </StackPanel> 
</DataTemplate> 
+0

Je n'ai pas compris. À quoi ressemblerait cette collection? Supposons que la zone de liste comporte un bloc de texte, une case à cocher et une zone de liste déroulante. En ce moment j'ai une collection de type x qui a un booléen et deux champs de texte. – James

Questions connexes