Мне интересно, как можно использовать привязку данных шаблона, чтобы выполнить то, что производит следующий код (сетка флажков с некоторым связанным текстом):
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 и установить горизонтальное направление повтора и привязку. Есть ли эквивалентный способ, менее императивный и более декларативный (т. Е. Сделанный заранее с шаблоном и с использованием общих средств «привязки данных»)?





<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 не переносится. Вместо этого используйте сетку и используйте группы общих размеров.
Набор инструментов Silverlight имеет панель обтекания.
Вот описание этого.
Будучи проектом с открытым исходным кодом, вы можете узнать, как он это делает, и создать что-то подобное для WPF, я не могу поверить, что никто, похоже, уже не перенес этот набор инструментов на полную версию WPF.
В полной реализации WPF уже есть WrapPanel. У Silverlight его еще не было, поэтому они добавили его в Silverlight Toolkit. То же самое и с DockPanel.
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 с горизонтальной ориентацией обеспечивает плавность хода.
Заворачивается ли это, когда достигает правой границы контейнера?