2009-03-26 10 views
27

私は、TabControlとTextBlockを含むWPFユーザーインターフェイスを構築しようとしています。WPF TabControl Databinding

私は、以下のクラスのインスタンスの基になるコレクションにこれらの2つのコントロールをバインドしたい:

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

タブコントロールは、各PageModelのタブが表示されます。

  • 各タブのヘッダーには、各タブの内容はTabContentプロパティでなければなりませんTabCaptionプロパティ
  • が表示されます。

TextBlockには、現在選択されているタブのタイトルが表示されます。

この結果はどのように達成できますか?

答えて

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

恐ろしい解決策。もっと便利なことは、Header Valueを{Binding Title}に、Content Valueを{Binding。}に設定することです。これにより、見出しのタイトルプロパティを持つページごとに1つのビューモデルのみを使用できます。 – Wouter

7

また、ItemTemplateとContentTemplateを使用して、hereの別の解決策が見つかりました。

私のようなWPFの初心者でも、頭痛や欲求不満の後、ObservableCollection<PageModel>の代わりにList<PageModel>が必要であることに気付きました。リストの変更はタブに反映されません。それがリストの場合はタブを追加または削除できません)。

関連する問題