2011-01-18 2 views
8

У меня есть TabControl контрольДобавление TabItems динамически

<TabControl Name="Farms_myVillages" 
      ItemsSource="{Binding Villages}"> 
</TabControl/> 

В коде позади добавить некоторые вкладки динамически в TabControl следующим образом:

foreach (Village vill in Villages) 
{ 
    TabItem tab = new TabItem(); 
    tab.Header = vill.Name; 
    VillageUserControl c = new VillageUserControl(); 
    c.DataContext = vill; 
    tab.Content = c; 
    Farms_myVillages.Items.Add(tab); 
} 

где VillageUserControl является UserControl, что дело с указанным деревня. Этот код отлично работает и получает ожидаемые результаты ...

Проблема в том, что я не хочу, чтобы это было в коде позади, но только в самом xaml.

Я стараюсь это:

<TabControl Name="Farms_myVillages" 
      ItemsSource="{Binding Villages}"> 
     <TabControl.ItemContainerStyle> 
      <Style TargetType="TabItem"> 
       <Setter Property="Header" Value="{Binding Name}"/> 
       <Setter Property="Content"> 
       <Setter.Value> 
        <u:VillageUserControl DataContext="{Binding}"/> 
       </Setter.Value> 
       </Setter> 
      </Style> 
     </TabControl.ItemContainerStyle> 
</TabControl> 

После того как я запустить его, он бросает исключение: «Указанного элемент уже является логическим потомком другого элемента Отключите его первым.»

Я что-то пропустил? Пожалуйста, помогите мне здесь ...

ответ

12

Вы установили неправильную вещь, вы не должны изменять ItemContainerStyle, но TabControl.ItemTemplate для заголовка и TabControl.ContentTemplate для контента.

(Исключение, возможно, придется делать с тем фактом, что в стиле создаются только один VillageUserControl, но стиль применяется к нескольким позициям табуляции.)

+0

да, спасибо HB от всего моего сердца. .. –

+0

Добро пожаловать, рад, что это помогло :) (На боковой ноте: вы можете отметить ответы через схему галочки, которая появляется, если вы перемещаете мышь под голосами слева, до сих пор вы не принимали никаких ответов на ваши вопросы, вы можете пройти через них и принять ответ, который помог самому) –

+0

да, я сделал это, действительно, это хорошо Веб-сайт.. –

2

Ваш подход не имея этого в коде является право, вместо использования ItemContainerStyle использовать ItemTemplate и ContentTemplate. Вы можете посмотреть на этом образце от Джоша Смита для создания вкладок с помощью шаблонов и стилей -

http://code.msdn.microsoft.com/mag200902MVVM/Release/ProjectReleases.aspx?ReleaseId=2026

3

Сейчас он работает:

<TabControl Name="Farms_myVillages" 
      ItemsSource="{Binding Villages}"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}"/> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <u:VillageResources/> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
</TabControl> 
Смежные вопросы