2014-05-20 21 views
6

Nel progetto che sto costruendo ho un TabControl in cui voglio visualizzare una gamma di schede attraverso un ItemsSource. Devo anche avere alcune schede "Panoramica" all'inizio dello TabControl, che non possono essere localizzate in ItemsSource.Aggiungere oggetti aggiuntivi quando si utilizza ItemsSource

Qual è il modo migliore per raggiungere questo obiettivo, l'unico modo che posso pensare è quello di avere le mie schede panoramica nella mia XAML e di aggiungere solo elementi di tabulazione manualmente tramite il codice invece di utilizzare ItemSource è questo il modo migliore per andare su esso.

risposta

8

È possibile utilizzare CompositeCollection (MSDN) per raggiungere questo obiettivo:

<Window.Resources> 
    <CollectionViewSource x:Key="ExistingTabs" Source="{Binding ExistingTabs}"/> 
</Window.Resources> 
<TabControl> 
    <TabControl.ItemsSource> 
     <CompositeCollection> 
      <TabItem>SpecialItem</TabItem> 
      <CollectionContainer Collection="{Binding Source={StaticResource ExistingTabs}}"/> 
     </CompositeCollection> 
    </TabControl.ItemsSource> 
</TabControl> 
-2

Sfortunatamente non è possibile combinare il binding di ItemsSource con oggetti di raccolta Oggetti esplicitamente aggiunti. Quindi hai due scelte: aggiungi elementi fissi e poi elementi dalla tua lista di vincoli manualmente alla raccolta Articoli o associa ItemsSource a una raccolta che contiene sia una serie di oggetti fissi sia gli elementi della tua collezione vincolata. In entrambi i casi, il problema più grande è probabilmente l'aggiornamento quando i dati cambiano, assicurandosi che gli elementi corretti vengano rimossi/aggiunti e l'interfaccia utente venga aggiornata correttamente.

+1

-1 Questo non è vero. C'è un 'CompositeCollection' che può essere usato per aggiungere DataBound CollectionSources più elementi arbitrari definiti da XAML. –

+0

Si prega di fornire questo come una risposta? – Hugoagogo

0

È possibile utilizzare CompositeCollection How do you add a generic item to a ComboBox bound to a collection in WPF

<TabControl> 
     <TabControl.ItemsSource> 
      <CompositeCollection> 
       <TabItem Header="extra tab item"> //Not bound 
        <TextBox>something</TextBox> 
       </TabItem> 
       <CollectionContainer x:Name="cc"/> 
      </CompositeCollection> 
     </TabControl.ItemsSource> 
    </TabControl> 

codice dietro:

cc.Collection=yourObservableCollection 
2

Per chiunque trovare il modo di usi ng HeaderTemplate/ContentTemplate con CollectionContainer:

Prima Aggiungere Tipo di proprietà in ViewModel

public Type Type { get { return this.GetType(); } } 

Utilizzare Style.Triggers per impostare HeaderTemplate/ContentTemplate per le schede dinamiche individuate dalla proprietà Type

<Window x:Class="TabDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TabDemo" 
     xmlns:vm="clr-namespace:TabDemo.ViewModel" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525" 
     d:DataContext="{d:DesignInstance vm:TabViewModel}"> 
    <Window.Resources> 
     <CollectionViewSource x:Key="ExistingTabs" Source="{Binding ExistingTabs}"/> 
     <DataTemplate x:Key="TemplateForTheHeader" DataType="{x:Type vm:TabViewModel}"> 
      <TextBlock Text="{Binding Title}"/> 
     </DataTemplate> 
     <DataTemplate x:Key="TemplateForTheContent" DataType="{x:Type vm:TabViewModel}"> 
      <DockPanel> 
       <DataGrid ItemsSource="{Binding Data}"></DataGrid> 
      </DockPanel> 
     </DataTemplate> 
     <Style x:Key="TabItemStyle" TargetType="TabItem"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=Type}" Value="{x:Type vm:TabViewModel}"> 
        <Setter Property="HeaderTemplate" Value="{StaticResource TemplateForTheHeader}" /> 
        <Setter Property="ContentTemplate" Value="{StaticResource TemplateForTheContent}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <TabControl Grid.Row="1" ItemContainerStyle="{StaticResource TabItemStyle}"> 
      <TabControl.ItemsSource> 
       <CompositeCollection> 
        <TabItem Header="Fixed Header"> 
         <TabItem.Content> 
          <TextBlock Text="Fixed Content"/> 
         </TabItem.Content> 
        </TabItem> 
        <CollectionContainer Collection="{Binding Source={StaticResource ExistingTabs}}"/> 
       </CompositeCollection> 
      </TabControl.ItemsSource> 
     </TabControl> 
    </Grid> 
</Window> 

Referente Anderson Imes's risposta: https://stackoverflow.com/a/1348369/1196637