2010-07-28 46 views
55

Chcę pobrać kolekcję obiektów i powiązać ją z StackPanel, więc w zasadzie, jeśli kolekcja ma 4 elementy, wewnątrz panelu stosu, który powinien wytworzyć 4 przyciski, powiedzmy.Powiąż kolekcję z StackPanel

Próbowałem tego ... Ale i tak nie sądzę, że jest to właściwe podejście. Użyłem DataTemplated do zrobienia tego typu pomysłu w przeszłości. Popraw mnie, jeśli się mylę.

Oto mój fałszywy wzór

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

W kodzie ustawić DataContext tak ...

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

I XAML

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

IT wiąże, ale zamiast 4 przycisków otrzymuję tylko jeden przycisk ...

Pomysły?

Odpowiedz

114

Alright ja zorientowaliśmy się ... Korzystanie z ItemsControl rozwiązało 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

To było to, czego potrzebowałem. Dziękuję Ci. – Trevor

+0

Nie zawsze jest to konieczne, ale w przypadku niektórych dalszych dostosowań należy ustawić właściwość "IsItemsHost" w StackPanel. – MatrixManAtYrService

+4

Gdzie ustawiasz 'ItemsSource'? Czy ten XAML jest zawijany w ''? – IAbstract