代码之家  ›  专栏  ›  技术社区  ›  Luke Foust

水平绑定XAML模板

  •  0
  • Luke Foust  · 技术社区  · 16 年前

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

            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中,可以使用数据列表并将重复方向设置为水平和绑定。是否有一种同等的方式,不那么必要,更具声明性(即,预先完成一个模板,并使用通用的“数据绑定”工具)?

    3 回复  |  直到 13 年前
        1
  •  1
  •   Tim Cooper    13 年前
    <ItemsControl ItemsSource="{Binding YourListOfItems}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <CheckBox IsChecked="{Binding YourIsChecked}"/>
                    <TextBlock Text="{Binding YourText}"/>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    

    这假定在名为 YourListOfItems . 在这些对象中,它假定存在被调用的属性 YourIsChecked ( bool ) YourText (大概 string )

        2
  •  0
  •   Luke Foust    16 年前

    AnthonyWjones认为包装面板是一种很好的方法,但Kent很难证明如何使用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>
    

    一个小问题是,数据模板需要一个子对象,所以使用水平方向的stackpanel可以保持流动。

        3
  •  0
  •   Luke Woodward    14 年前

    这个 Silverlight toolkit 具有包装面板。

    这里是一个 description 其中。

    作为一个开源项目,你可以发现它是如何做到的,并为WPF创建类似的东西,我不能相信似乎没有人已经将这个工具包移植到完整的WPF中。