2010-07-28 20 views
55

Voglio prendere una raccolta di oggetti e collegarla a uno StackPanel in modo sostanziale se la raccolta ha 4 elementi, all'interno del pannello dello stack che dovrebbe produrre 4 pulsanti, diciamo.Bind Collection to StackPanel

Ho provato questo ... Ma non penso che sia l'approccio corretto comunque. Ho usato DataTemplated per fare questo tipo di idea in passato .. per favore correggimi se sbaglio.

Ecco il mio modello falso

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; } 
    } 
} 

Nel codice ho impostato il DataContext come questo ...

// 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; 

E il XAML

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

IT bind ma invece di 4 pulsanti ottengo solo un pulsante ....

Idee?

risposta

114

Va bene ho capito ... L'utilizzo di un ItemsControl risolto il problema ...

<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

Questo era proprio quello che mi serviva. Grazie. – Trevor

+0

Non è sempre necessario, ma per alcune ulteriori personalizzazioni è necessario impostare la proprietà "IsItemsHost" su StackPanel. – MatrixManAtYrService

+4

Dove stai impostando 'ItemsSource'? Questo XAML è imballato in un ''? – IAbstract