2011-01-18 5 views
8

Mam TabControl kontrolęDodawanie TabItems dynamicznie

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

w kodzie za dodać kilka kart dynamicznie do TabControl następująco:

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); 
} 

gdzie VillageUserControl jest UserControl które dotyczą określonego wioska. Ten kod działa poprawnie i uzyskuje oczekiwane rezultaty ...

Problem polega na tym, że nie chcę, aby kod ten znajdował się w kodzie, ale tylko w samym xaml.

próbuję to:

<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> 

Po uruchamiania go zgłasza wyjątek: „określony element jest już logiczne dzieckiem innego elementu odłącz go w pierwszej kolejności.”

Czy coś mi umknęło? Proszę pomóżcie mi tutaj ...

Odpowiedz

12

Ustawiłeś niewłaściwą rzecz, nie powinieneś modyfikować ItemContainerStyle, ale TabControl.ItemTemplate dla nagłówka i TabControl.ContentTemplate dla zawartości.

(Wyjątkiem może mieć do czynienia z faktem, że w tym stylu jest tworzony tylko jeden VillageUserControl, ale styl odnosi się do wielu elementów tab.)

+0

Tak, dziękuję HB z całego serca. .. –

+0

Nie ma za co, cieszę się, że pomogło :) (Na marginesie: Możesz zaznaczyć odpowiedzi poprzez kontur znaczka, który pojawia się, gdy przesuniesz mysz poniżej głosów po lewej stronie, do tej pory nie zaakceptowałeś żadnych odpowiedzi twoje pytania, możesz chcieć je przejrzeć i zaakceptować odpowiedź, która pomogła najbardziej) –

+0

tak, zrobiłem to, naprawdę to jest dobre stronie internetowej.. –

3

Teraz to działa:

<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>