Возможно, вам нужен элемент ItemsControl. Это позволяет представить ряд элементов, используя указанный DataTemplate. Вы можете сделать это встроенный в ItemsControl:
<ItemsControl ItemsSource="{Binding MyCollectionOfItems}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
или ссылаться на данные шаблона явно из ресурса ... что-то подобное:
<!-- In some parent resource section -->
<DataTemplate x:Key="MyDataTemplateName">
<CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
</DataTemplate>
<!-- ... -->
<ItemsControl ItemsSource="{Binding MyCollectionOfItems}" ItemTemplate="{StaticResource MyDataTemplateName}">
</ItemsControl>
Или вы можете определить DataTemplate, определяющий внешний вид и почувствуйте себя связанным классом. (Обратите внимание, что если ваш Linq к SQL проецирует в анонимный тип, это не вариант) Что-то вроде:
<!-- In some parent resource section -->
<DataTemplate DataType="{x:Type MyBoundClass}">
<CheckBox IsChecked="{Binding NameOfTheCheckedPropertyOnEachItem}"/>
</DataTemplate>
<!-- ... -->
<ItemsControl ItemsSource="{Binding MyCollectionOfItems}">
</ItemsControl>
WPF будет искать DataTemplate, который соответствует типу данных каждого из элементов в вашей коллекции. Обратите внимание, что это может быть ОЧЕНЬ полезно для привязки разнородных коллекций, которым нужны разные презентации.
Вы можете привязать DataContext к Stackpanel, но нет встроенной логики повторения шаблона для каждого элемента данных. Он просто предоставляет контекст для дочерних элементов управления и содержит операторы {Binding ...}
. Все элементы управления, которые обрабатывают повторяющиеся данные, сходят с ItemsControl и берут свои данные через свойство ItemsSource.
+1 Хороший, тщательный ответ. –