将StackPanel子项绑定到ObservableCollection

时间:2013-05-27 12:17:09

标签: c# wpf xaml binding stackpanel

我有一个ObservableCollection按钮:

public partial class MainWindow : Window   
     {
        public ObservableCollection<Button> myBtCollection { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            myBtCollection = new ObservableCollection<Button>();

            Button bot1 = new Button { Width = 200, Height = 25, Content = "Boton 1" };
            Button bot2 = new Button { Width = 150, Height = 50, Content = "Boton 2" };
            Button bot3 = new Button { Width = 100, Height = 100, Content = "Boton 3" };

            myBtCollection.Add(bot1);
            myBtCollection.Add(bot2);
            myBtCollection.Add(bot3);
            myBtCollection.Add(bot1);
            myBtCollection.Add(bot3);
            myBtCollection.Add(bot2);
            myBtCollection.Add(bot1);
        }
    }

我想将该集合绑定到我的StackPanel(在此示例中,它是一个常量集合,但最终它将是可变的)。这是我的XAML:

<Window x:Name="mainWindow" x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Grid>
        <StackPanel x:Name="stack">

        </StackPanel>

        <ItemsControl  Width="Auto" 
                       Height="Auto"
                       ItemsSource="{Binding ElementName=mainWindow, Path=myBtCollection}">      
        </ItemsControl>


    </Grid>
</Window>

我已经读过它可以通过使用ItemsControl来实现,但我不知道如何完成它。 (我是否需要在代码中设置DataContext?)

2 个答案:

答案 0 :(得分:5)

我同意@inxs的评论。但是为了使这项工作在创建myBtCollection之后移动InitializeComponent()

public MainWindow()
{
    myBtCollection = new ObservableCollection<Button>();
    ...

    InitializeComponent();
}

或为myBtCollection实施INotifyPropertyChanged

答案 1 :(得分:4)

  1. ItemsControl已使用Vertical StackPanel。
  2. 您无法将数据绑定到用于可视布局的StackPanel。
  3. 如果您希望使用其他Panel或更改StackPanels方向,您可以使用ItemsControl上的Property“ItemsPanel”并将其设置为:

    <ItemsControl.Style>
                <Style TargetType="{x:Type ItemsControl}">
                    <Setter Property="ItemsPanel">
                        <Setter.Value>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal"/>
                            </ItemsPanelTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
     </ItemsControl.Style>