将集合绑定到StackPanel


72

我想获取一个对象集合并将其绑定到StackPanel,因此基本上来说,如果该集合具有4个元素,应该在应该产生4个按钮的堆栈面板内部说。

我尝试过...但是无论如何我都不认为这是正确的方法。我过去曾使用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>

它确实绑定了,但我只得到一个按钮,而不是4个按钮。

有想法吗?

Answers:


154

好吧,我已经弄清楚了...使用已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 Tubbs 2012年

并非总是必要的,但是对于某些进一步的自定义,您需要在StackPanel上设置“ IsItemsHost”属性。
MatrixManAtYrService 2014年

9
你在哪里设置ItemsSource?此XAML是否包装在中<Grid/>
IAbstract 2014年

4
@IAbstract ItemsSource在中设置ItemsControl
Lynn在2015年

1
在你的例子中,只有4个按键,但如果你有收藏的许多项目被束缚,您可能需要使用VirtualizingStackPanelItemsPanelTemplate这里提到:stackoverflow.com/a/1525874/232530
卢卡斯中号
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.