2010-07-28 5 views
55

Ich möchte eine Sammlung von Objekten nehmen und sie an ein StackPanel binden, also im Grunde, wenn die Sammlung 4 Elemente hat, innerhalb des Stack Panels, das 4 Buttons erzeugen soll.Bind Collection zu StackPanel

Ich habe das versucht ... Aber ich denke nicht, dass es der richtige Ansatz sowieso ist. Ich habe DataTemplated verwendet, um diese Art von Idee in der Vergangenheit zu machen. Bitte korrigieren Sie mich, wenn ich falsch liege.

Hier ist mein gefälschtes Modell

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

In Code, den ich die Datacontext wie folgt festgelegt ...

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

Und die XAML

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

Es bindet aber anstelle von 4 Tasten bekomme ich nur eine Taste ....

Ideen?

Antwort

114

Okay ich es herausgefunden habe ... Mit einem ItemsControl lösten das Problem ...

<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

Das war genau das, was ich brauchte. Vielen Dank. – Trevor

+0

Es ist nicht immer notwendig, aber für einige weitere Anpassungen müssen Sie die "IsItemsHost" -Eigenschaft auf StackPanel setzen. – MatrixManAtYrService

+4

Wo setzen Sie 'ItemsSource'? Ist dieser XAML in eine ''' Hülle verpackt? – IAbstract