如何将 TabControl 的项目绑定到 wpf 中的可观察集合?

Posted

技术标签:

【中文标题】如何将 TabControl 的项目绑定到 wpf 中的可观察集合?【英文标题】:How to bind items of a TabControl to an observable collection in wpf? 【发布时间】:2010-11-18 16:01:50 【问题描述】:

将 TabControl 的项绑定到 ObservableCollection 的最简单示例是什么?

每个选项卡的内容都将具有唯一的数据,并且确实这些数据将具有自己绑定到项目组件的 observableCollections。

目前我有一个用户控件,我想在创建每个选项卡后立即将其设置为每个选项卡的内容。我还需要在创建选项卡时动态设置这个新用户控件的数据上下文。所以,本质上,我希望 tabcontrol 的 observablecollection 包含映射到每个选项卡中数据的模型视图。

最重要的是,我需要在不违反 WPF 中的 MVVM 的情况下完成这一切!有什么帮助吗?

非常感谢!

【问题讨论】:

【参考方案1】:

基本示例:

<Window.Resources>

    <DataTemplate x:Key="templateForTheContent" DataType="x:Type vm:TheViewModelType">
        <v:YourUserControl/>
    </DataTemplate>

    <DataTemplate x:Key="templateForTheHeader" DataType="x:Type vm:TheViewModelType">
        <TextBlock Text="Binding ThePropertyToDisplayInTheHeader"/>
    </DataTemplate>

</Window.Resources>

...

<TabControl ItemsSource="Binding YourCollection"
            ContentTemplate="StaticResource templateForTheContent"
            ItemTemplate="StaticResource templateForTheHeader">
</TabControl>

【讨论】:

您知道,WPF + MVVM 的学习曲线如此陡峭,但是一旦您掌握了窍门,这些解决方案实际上非常优雅和干净。感谢您的帮助:) 我同意 WPF 有一个陡峭的学习曲线,但我不会说 MVVM 模式...实际上当你开始使用它时感觉很自然:) 只要数据模板只包含只读控件,这种方法就可以工作。否则,您必须小心:每次更改选项卡页时,TabControl 都会重新创建视图,即当您从一个选项卡切换到另一个选项卡然后再次切换回来时,您会失去视觉状态。 如果我在绑定集合中有多个 ViewModel 类型,这会起作用吗? @Onur,是的。在这种情况下,不要在 DataTemplate 上放置x:Key 属性,并为每个项目类型创建不同的 DataTemplate

以上是关于如何将 TabControl 的项目绑定到 wpf 中的可观察集合?的主要内容,如果未能解决你的问题,请参考以下文章

MVVM从TabControl绑定到Page.DataContext

WPF TabControl在开始时没有选择的项目

如何确保我的 WPF TabControl 在至少包含一个选项卡时始终具有选定的选项卡?

如何将自定义控件派生的 TabItem 添加到 WPF 中的 TabControl?

WPF TabControl 绑定错误

如何将 TabControl 绑定到 ViewModel 集合?