将集合绑定到StackPanel

Gab*_*abe 66 c# data-binding silverlight xaml

我想获取一个对象集合并将其绑定到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; }
   }
}
Run Code Online (Sandbox Code Playgroud)

在代码中我像这样设置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;
Run Code Online (Sandbox Code Playgroud)

和xaml

<StackPanel x:Name="tStack">
   <ItemsControl ItemsSource="{Binding Nodes}">
      <ItemsControl.Template>
         <ControlTemplate>
            <Button Content="{Binding ItemName}"/>
         </ControlTemplate>
      </ItemsControl.Template>
   </ItemsControl>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

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

想法?

Gab*_*abe 145

好吧,我已经弄明白了...用一个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>
Run Code Online (Sandbox Code Playgroud)

  • 你在哪里设置`ItemsSource`?这个XAML是否包含在`<Grid />`中? (8认同)
  • @IAbstract ItemsSource在`ItemsControl`中设置. (3认同)
  • 在您的示例中,只有 4 个按钮,但如果集合中有许多项目需要绑定,您可能需要在 `ItemsPanelTemplate` 中使用 `VirtualizingStackPanel`,如下所述:http://stackoverflow.com/a/ 1525874/232530 (2认同)