Вы должны поместить объект, который вы хотите «клонировать» в DataTemplate
и ссылаться на этот шаблон из ItemsControl
, затем, когда вам понадобится другая сетка, добавить еще один элемент в элемент управления элементов (или, что еще лучше, в список). элемент управления привязан), и ItemsControl
создаст новую сетку и свяжет ее с новым объектом.
Для примера посмотрите на это сообщение в моем блоге.
Вот пример для этого приложения (я оставил только соответствующие части, и я не проверял его, поэтому, возможно, там есть некоторые опечатки):
<Window ... >
<Window.Resources>
<DataTemplate x:Key="ChildTemplate">
<Grid>
...
<TextBlock Text="Delivery Date:" Grid.Column="0" Grid.Row="0"/>
<TextBox Text="{Binding DeliveryDate}" Grid.Column="1" Grid.Row="0"/>
<TextBlock Text="Delivery Time:" Grid.Column="0" Grid.Row="1"/>
<TextBox Text="{Binding DeliveryTime}" Grid.Column="1" Grid.Row="1"/>
...
</Grid>
</DataTemplate>
</Window.Resources>
...
<Button Content="AddChild" Click="AddChildClick"/>
...
<ScrollViewer>
<ItemsControl ItemsSource="{Binding AllChildren}" ItemsTemplate="{StaticResource ChildTemplate}">
<ItemsControl.PanelTemplate>
<ItemsPanelTemplate><StackPanel Orientation="Horizontal"/></ItemPanelTemplate>
<ItemsControl.PanelTemplate>
</ScrollViewer>
...
</Window>
И в CS:
- Установить объект со всеми данными формы в качестве окна
DataContext
. Я назову этот класс PostDelveryData
.
- Создайте другой класс с повторяющимися данными. Я назову это
ChildDeliveryData
.
- Добавить свойство типа
ObservableCollection<ChildDeliveryData>
с именем AllChildren
в PostDeliveryData
; важно, что это будет ObservableCollection
, а не какой-либо другой тип коллекции.
Теперь по волшебству:
private void AddChildClick(object sender, RoutedEvetnArgs e)
{
((PostDeliveryData)DataContext).AllChildren.Add(new ChildDeliveryData());
}
А когда вы добавляете новый элемент в список, будет добавлена еще одна копия всего шаблона данных.