У меня есть следующий код, и в основном я не могу понять, как клонировать всю сетку и сделать их пустую копию рядом ... для четкого понимания, это как-то связано с заявлением в больнице и сетка связана с беременностью, поэтому при нажатии кнопки «ДОБАВИТЬ РЕБЕНКА» во время выполнения должна быть создана целая новая сетка, спасибо за помощь ниже - это ссылка, которая может помочь людям, потому что я пробовал, но не уверен, как ее отобразить
Как клонировать всю сетку элементов управления?
Ответы (3)
Вы должны поместить объект, который хотите «клонировать» в 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()); }
И когда вы добавите новый элемент в список, будет добавлена еще одна копия всего шаблона данных.
Я не уверен, что вы используете здесь правильный подход. Я бы подошел к проблеме, создав «ChildGridControl» со свойством Child, и позволил бы свойству Child обрабатывать привязку данных. Добавление нового дочернего элемента в графический интерфейс потребует создания нового экземпляра ChildGridControl.
Если я правильно понимаю, вы должны создать UserControl, который обертывает вашу сетку и последующие элементы управления внутри. И используйте этот пользовательский элемент управления везде, где хотите воспроизвести этот пользовательский интерфейс.