【问题标题】:XAML Template Binding HorizontallyXAML 模板水平绑定
【发布时间】:2009-01-13 17:14:38
【问题描述】:

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

        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 并将重复方向设置为水平并绑定。有没有一种等效的方式,它的命令性和声明性更强(即预先使用模板完成并使用通用的“数据绑定”工具)?

【问题讨论】:

    标签: data-binding xaml templates


    【解决方案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 的属性中拥有一组对象。在每个对象中,它假定存在名为YourIsChecked (bool) 和YourText(可能是string)的属性。

    【讨论】:

    • 当它到达容器的右边界时会换行吗?
    • 我不确定如何将偶数因素包含在这个问题中。如果您需要包装物品,请使用适当的容器。 StackPanel 不是包装的合适容器。
    • @Kent - 谢谢,但这是我开始的,而 AnthonyWJones 是正确的,它没有包装。我想我将从 Silverlight 工具包 Wrap Panel 开始。
    • 就像我说的 - StackPanel 不会换行。改用网格并使用共享尺寸组。
    【解决方案2】:

    AnthonyWJones 认为 Wrap Panel 是一种很好的方法是正确的,但 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>
    

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

    【讨论】:

      【解决方案3】:

      Silverlight toolkit 有一个环绕面板。

      这是其中的description

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

      【讨论】:

      • 完整的 WPF 实现已经有一个 WrapPanel。 Silverlight 还没有它,所以他们将它添加到 Silverlight 工具包中。 DockPanel 也是如此。
      猜你喜欢
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多