2010-07-28 6 views
55

Je veux prendre une collection d'objets et la lier à un StackPanel donc si la collection a 4 éléments, à l'intérieur du panneau de la pile qui devrait produire 4 boutons, disons.Lier Collection à StackPanel

J'ai essayé cela ... Mais je ne pense pas que ce soit la bonne approche de toute façon. J'ai utilisé DataTemplated pour faire ce type d'idée dans le passé .. s'il vous plaît corrigez-moi si je me trompe.

Voici mon modèle faux

public class MockModel 
{ 
    public ObservableCollection<MockNode> Nodes; 

    public MockModel() 
    { 
     Nodes = new ObservableCollection<MockNode>(); 
    } 
} 

public class MockNode 
{ 
    public MockNode() 
    { 
    } 

    private string itemname; 
    public string ItemName 
    { 
     get { return this.itemname; } 
     set { this.itemname = value; } 
    } 
} 

Dans le code, je mets le DataContext comme ça ...

// Init Model 
MockModel myModel = new MockModel(); 

for (int i = 0; i < 4; i++) 
{ 
    MockNode mn = new MockNode(); 
    mn.ItemName = String.Format("Node {0}", i); 
    myModel.Nodes.Add(mn); 
} 
// Set DataContext for StackPanel 
Stack.DataContext = myModel.Nodes; 

Et le XAML

<StackPanel x:Name="tStack"> 
    <ItemsControl ItemsSource="{Binding Nodes}"> 
     <ItemsControl.Template> 
     <ControlTemplate> 
      <Button Content="{Binding ItemName}"/> 
     </ControlTemplate> 
     </ItemsControl.Template> 
    </ItemsControl> 
</StackPanel> 

IT lie mais au lieu de 4 boutons je reçois seulement un bouton ....

Idées?

Répondre

114

D'accord, je l'ai pensé à elle ... L'utilisation d'un ItemsControl résolu le problème ...

<ItemsControl x:Name="tStack" Grid.Column="0"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <Button Content="{Binding ItemName}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+1

C'était exactement ce qu'il me fallait. Je vous remercie. – Trevor

+0

Ce n'est pas toujours nécessaire, mais pour d'autres personnalisations, vous devez définir la propriété "IsItemsHost" sur StackPanel. – MatrixManAtYrService

+4

Où définissez-vous 'ItemsSource'? Ce code XAML est-il entouré d'un ''? – IAbstract

Questions connexes