web-dev-qa-db-ja.com

WPFTabControlデータバインディング

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

これらの2つのコントロールを、次のクラスのインスタンスの基になるコレクションにバインドしたいと思います。

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

タブコントロールは、各PageModelのタブを表示する必要があります。

  • 各タブのヘッダーには、TabCaptionプロパティが表示されます。
  • 各タブのコンテンツはTabContentプロパティである必要があります。

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

どうすればこの結果を達成できますか?

27
mackenir
<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}"/>
63
Kent Boogaart

また、ItemTemplateとContentTemplateを使用して、これに対する別の解決策を見つけました ここ

また、私のようなWPF初心者の場合、いくつかの頭痛と欲求不満の後で、ページモデルのコレクションをObservableCollection<PageModel>ではなくList<PageModel>にする必要があることに気付きました。そうしないと、リストへの変更が反映されません。タブ(つまり、リストの場合、タブを追加または削除することはできません)。

7
sfaust