2010-07-28 5 views
55

Я хочу взять коллекцию объектов и привязать их к StackPanel, так что в принципе, если коллекция имеет 4 элемента, внутри панели стека, которая должна выпустить 4 кнопки, скажем.Bind Collection to StackPanel

Я пробовал это ... Но я не думаю, что это правильный подход. Я использовал DataTemplated, чтобы сделать этот тип идеи в прошлом. Пожалуйста, поправьте меня, если я ошибаюсь.

Вот мой поддельный модель

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

В коде я поставил DataContext, как это ...

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

И XAML

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

IT действительно связывается, но вместо 4 кнопок я получаю только одну кнопку ....

Идеи?

ответ

114

Хорошо, я понял это ... спользование ItemsControl решил проблему ...

<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

Это было как раз то, что мне было нужно. Спасибо. – Trevor

+0

Это не всегда необходимо, но для некоторых дополнительных настроек вам нужно установить свойство IsItemsHost на StackPanel. – MatrixManAtYrService

+4

Где вы устанавливаете 'ItemsSource'? Является ли этот XAML завернутым в ''? – IAbstract