Как клонировать всю сетку элементов управления?

У меня есть следующий код, и в основном я не могу понять, как клонировать всю сетку и сделать их пустую копию рядом ... для четкого понимания, это как-то связано с заявлением в больнице и сетка связана с беременностью, поэтому при нажатии кнопки «ДОБАВИТЬ РЕБЕНКА» во время выполнения должна быть создана целая новая сетка, спасибо за помощь ниже - это ссылка, которая может помочь людям, потому что я пробовал, но не уверен, как ее отобразить

Как можно клонировать объект WPF?


person Community    schedule 08.02.2009    source источник
comment
К сожалению, ни один из фреймворков, с которыми я столкнулся до сих пор (как веб, так и настольный компьютер), не предоставляет такой возможности. Я считаю, что это было бы очень полезно, если бы она была реализована.   -  person Agnel Kurian    schedule 19.05.2009
comment
Большинство ответов, представленных здесь, не будут иметь никакого смысла, если клонируемый элемент управления инициализируется каким-либо сторонним кодом.   -  person Agnel Kurian    schedule 19.05.2009


Ответы (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:

  1. Установите объект со всеми данными формы как DataContext окна. Я назову этот класс PostDelveryData.
  2. Создайте еще один класс с повторяющимися данными. Я назову это ChildDeliveryData.
  3. Добавьте свойство типа ObservableCollection<ChildDeliveryData> с именем AllChildren в PostDeliveryData; важно, что это будет ObservableCollection, а не какой-либо другой тип коллекции.
  4. Теперь о волшебстве:

    private void AddChildClick(object sender, RoutedEvetnArgs e)
    {
       ((PostDeliveryData)DataContext).AllChildren.Add(new ChildDeliveryData());
    }
    

И когда вы добавите новый элемент в список, будет добавлена ​​еще одна копия всего шаблона данных.

person Nir    schedule 08.02.2009
comment
так что, используя дочерний элемент управления сеткой, я смогу сделать полностью новую копию существующей сетки? ... flickr.com/photos/14529949@N07/3262167943, так как из диаграммы вы можете понять, что мне нужно добавить все эти элементы управления, если вы хотите увидеть весь проект, пожалуйста, дайте мне знать, спасибо - person ; 08.02.2009
comment
это действительно немного сбивает с толку любое примерное приложение, прежде чем я взорву себе мозги, думая и пытаясь выяснить - person ; 08.02.2009
comment
эй, НИР, я пробовал то, что ты сказал, чувак, но мне немного сложно использовать это, не совсем понимаю ... догадываюсь, что я новичок, в конце концов ... пожалуйста, помогите до четвертого дня сдать ... Я загрузил файл по следующей ссылке tinyurl.com/ajyvnw, я предложил использовать контрольную библиотеку, пожалуйста, помогите. - person ; 10.02.2009
comment
О, я забыл сказать спасибо заранее, а также я знаю, что вы беспокоитесь о том, что tinyurl может быть вирусом, о котором вы могли подумать, пожалуйста, не подозревайте меня, я сделал это, так как меня считают среди персонажей спасибо - person ; 10.02.2009

Я не уверен, что вы используете здесь правильный подход. Я бы подошел к проблеме, создав «ChildGridControl» со ​​свойством Child, и позволил бы свойству Child обрабатывать привязку данных. Добавление нового дочернего элемента в графический интерфейс потребует создания нового экземпляра ChildGridControl.

person davogones    schedule 08.02.2009
comment
так что, используя дочерний элемент управления сеткой, я смогу сделать полностью новую копию существующей сетки? ... flickr.com/photos/14529949@N07/3262167943, так как из диаграммы вы можете понять, что мне нужно добавить все эти элементы управления, если вы хотите увидеть весь проект, пожалуйста, дайте мне знать, спасибо - person ; 08.02.2009
comment
Что ж, я хотел сказать, что вам не нужно копировать эту дочернюю сетку. Если вы инкапсулируете дочернюю сетку в пользовательский элемент управления, вы можете добавить столько экземпляров пользовательского элемента управления, сколько захотите. Другой вариант - иметь только одну сетку на странице, но заполнять ее другим дочерним элементом. - person davogones; 08.02.2009

Если я правильно понимаю, вы должны создать UserControl, который обертывает вашу сетку и последующие элементы управления внутри. И используйте этот пользовательский элемент управления везде, где хотите воспроизвести этот пользовательский интерфейс.

person Jobi Joy    schedule 08.02.2009
comment
так что, используя дочерний элемент управления сеткой, я смогу сделать полностью новую копию существующей сетки? ... flickr.com/photos/14529949@N07/3262167943, так как из диаграммы вы можете понять, что мне нужно добавить все эти элементы управления, если вы хотите увидеть весь проект, пожалуйста, дайте мне знать, спасибо - person ; 08.02.2009
comment
Это мой ответ: вы должны создать UserControl с этими элементами внутри. - person Jobi Joy; 09.02.2009