2009-03-26 14 views
27

Sto provando a creare un'interfaccia utente WPF contenente un TabControl e un TextBlock.WPF TabControl Databinding

voglio legare questi due controlli ad una collezione di base di istanze del seguente classe:

class PageModel 
{ 
    public string Title {get;set;} 
    public string TabCaption {get;set;} 
    public FrameworkElement TabContent {get;set} 
} 

controllo La scheda dovrebbe visualizzare una scheda per ogni PageModel.

  • colpo di testa di ogni scheda dovrebbe visualizzare la proprietà TabCaption
  • contenuto di ogni scheda dovrebbe essere la proprietà TabContent.

Il TextBlock dovrebbe visualizzare il titolo della scheda attualmente selezionata.

Come posso ottenere questo risultato?

risposta

61
<TabControl x:Name="_tabControl" ItemsSource="{Binding PageModels}"> 
    <TabControl.ItemContainerStyle> 
     <Style TargetType="TabItem"> 
      <Setter Property="Header" Value="{Binding TabCaption}"/> 
      <Setter Property="Content" Value="{Binding TabContent}"/> 
     </Style> 
    </TabControl.ItemContainerStyle> 
</TabControl> 
<TextBlock Text="{Binding SelectedItem.Title, ElementName=_tabControl}"/> 
+1

Soluzione eccezionale. Un'altra cosa utile è impostare il valore dell'intestazione su {Binding Title} e il valore del contenuto su {Binding.}. Ciò consente di utilizzare un solo viewmodel per pagina con una proprietà Title per l'intestazione. – Wouter

7

Ho anche trovato un'altra soluzione a questo here utilizzando ItemTemplate e ContentTemplate.

anche per eventuali neofiti WPF come me, dopo qualche mal di testa e frustrazione ho capito che la collezione di modelli di pagina deve essere un ObservableCollection<PageModel> invece di un List<PageModel> o qualunque modifica alla lista non sarà riflessa dalle linguette (si es non è possibile aggiungere o rimuovere una scheda se si tratta di un elenco).

Problemi correlati