2016-06-06 3 views
0

Я новичок, когда дело доходит до WPF, поэтому я даже не знаю, возможно ли то, что я пытаюсь сделать. Я читал о ItemsControl для создания многочисленных экземпляров элемента. Все примеры, которые я видел, только позволяют создавать X количество элементов для одного «типа», как на примере ниже:Создание нескольких элементов с помощью ItemsControl

ItemsControl ItemsSource="{Binding MyCollection}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button Content="{Binding }" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

который создает кнопку для каждого элемента в ItemSource.

Я хочу, чтобы создавать элементы различных типов, такие как TextBox, Button и ComboBox, с помощью ItemsControl в любое время, когда я нажимаю кнопку. Поэтому, когда я нажимаю samp_Btn1, я хочу, чтобы новый TextBox и кнопка появлялись под тем, который я уже отображал.

Я пробовал:

ItemsControl> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button Name="test_Btn" 
       Width="50" 
       Height="50"/> 
      <TextBox Name="test_TextBox" Width="50" Height="50" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

, а затем функцию, которая только что создали новый ItemControl

 private void createNewItem() 
    { 
     ItemsControl test = new ItemsControl(); 
    } 

, но я получаю сообщение об ошибке сказав, что PropertyVisual Tree установлен более чем один раз. Является ли это правильным способом заниматься вещами или мне нужно создать ItemControl для TextBox и Button отдельно?

+4

DataTemplate может содержать только один элемент. Но это, конечно, может быть панель с несколькими дочерними элементами, например. StackPanel или Grid. – Clemens

+0

@Clemens Итак, вы имеете в виду положить тег после того, как тег может быть потенциальным исправлением? –

+1

http://stackoverflow.com/questions/23885919/the-property-visualtree-is-set-more-than-once-in-windows-phone-8-c-sharp/23885980#23885980 – NSGaga

ответ

0

Как указано @NSGaga и @Clemens, вы должны обернуть элементы управления в контейнер - например, сетку.

<ItemsControl> 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <Button Name="test_Btn" Width="50" Height="50"/> 
      <TextBox Name="test_TextBox" Width="50" Height="50" /> 
     </Grid> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 
</ItemsControl> 

Помните, что это относится не только к ItemsControl. Попробуйте положить, например. две сетки непосредственно в виде содержимого MainWindow. Вы получите:

Свойство «Содержимое» может быть установлено только дважды.

Данные элементы управления не предназначены для хранения collection of children.

Элементы должны иметь какой-то опорный кадр. То, для чего вы используете сетку - вы физически позиционируете их, предоставляя им позиции относительно Grid.

Кроме того, если это какой-то продуманный дизайн с дополнительной функциональностью, которую вы пытаетесь создать в ItemsControl, вы можете рассмотреть возможность поиска в UserControl.

Для этого here - это ссылка, которая поможет вам начать работу.

+0

Это действительно очистило вещи для меня! Спасибо за объяснение. –

+0

Добро пожаловать :) –

Смежные вопросы