XAML模板水平绑定

时间:2009-01-13 17:14:38

标签: data-binding xaml templates

我想知道如何使用模板数据绑定来完成以下代码生成的内容(带有一些相关文本的复选框网格):

        int tbIndex = 0;
        for (int i = 1; i < 5; i++) {
            StackPanel pan = new StackPanel();
            pan.Orientation = Orientation.Horizontal;
            pan.Margin = new Thickness(3);
            pan.Name = "RowPanel" + i;
            for (int j = 0; j < 3; j++) {
                CheckBox cb = new CheckBox();
                TextBlock block = new TextBlock();
                block.Width = 75;
                block.Text = "Item " + (++tbIndex).ToString();
                pan.Children.Add( cb );
                pan.Children.Add( block );
            }
            ContentPanel.Children.Add( pan );
        }

例如,在ASP.NET中,可以使用DataList并将重复方向设置为水平和绑定。是否存在一种不那么强制性和更具声明性的等效方式(即,使用模板和使用通用的“数据绑定”工具预先完成)?

3 个答案:

答案 0 :(得分:1)

<ItemsControl ItemsSource="{Binding YourListOfItems}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding YourIsChecked}"/>
                <TextBlock Text="{Binding YourText}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这假设您在名为YourListOfItems的属性中有一组对象。在每个对象中,它假定存在名为YourIsCheckedbool)和YourText(可能是string)的属性。

答案 1 :(得分:0)

Silverlight toolkit有一个Wrap Panel。

这是description

作为一个开源项目,您可以了解它是如何做到的并为WPF创建类似的东西,我无法相信没有人似乎已经将此工具包移植到完整的WPF中。

答案 2 :(得分:0)

AnthonyWJones说得对,Wrap Panel是一个很好的方法,但肯特经历了如何使用ItemSource(尽管没有达到目标的StackPanel)的麻烦。因此,我将发布演示声明等效的代码:

<ItemsControl x:Name="myItems" Width="300">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <controls:WrapPanel x:Name="itemsWrapPanel" Margin="0" Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Width="100">
                <CheckBox IsChecked="{Binding MyCheckedProperty, Mode=TwoWay}" x:Name="IsSelectedCheckBox" Height="25"></CheckBox>
                <TextBlock Height="12" Text="{Binding MyTextProperty}" Margin="0" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

一个小问题是DataTemplate需要一个孩子,因此使用水平方向的StackPanel可以保持流畅。