1. ホーム
  2. c#

コレクションをStackPanelにバインドする

2023-11-03 16:51:29

質問

オブジェクトのコレクションを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つのボタンの代わりに1つのボタンしか表示されません...。

何かいい方法はないでしょうか?

どのように解決するのですか?

さて、私はそれを考え出した... このように 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>