我想知道如何使用模板数据绑定来完成以下代码生成的内容(带有一些相关文本的复选框网格):
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并将重复方向设置为水平和绑定。是否存在一种不那么强制性和更具声明性的等效方式(即,使用模板和使用通用的“数据绑定”工具预先完成)?
答案 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
的属性中有一组对象。在每个对象中,它假定存在名为YourIsChecked
(bool
)和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可以保持流畅。