【问题标题】:Binding collection of viewmodels to WPF MVVM TabControl将视图模型集合绑定到 WPF MVVM TabControl
【发布时间】:2018-10-25 09:18:13
【问题描述】:

我有一组 ViewModel 我想绑定到 TabControlItemsSource 属性并能够动态添加/删除它们,因此已实现为 Observable<TabViewModel>

然而TabControl 似乎期望继承自TabItem 的类型,TabItem 是一个视觉控制对象。我不希望我的 ViewModels 从 TabItem 继承,因为这意味着它们需要绑定到可视化实现,并且所有测试都需要作为 STA 运行。

如何绑定 ViewModel 集合以填充选项卡控件的标题和内容,而不依赖于 TabItem 对象?即仅使用我认为基于 ViewModel 类型的样式和模板。就像您有一个 ListBox 并希望项目直接从 viewmodel 实例中渲染,使用特定的模板,这很容易通过覆盖 ItemTemplate 属性来实现。

如何在不使用TabItem 的情况下使用TabControl 执行此操作?

【问题讨论】:

  • 那么你想基于一个集合创建 TabItems 吗?
  • 不确定这是否正是您要寻找的,但这是我开始使用 TabControl 时使用的great video
  • stackoverflow.com/a/5651542/1228 我刚刚查了这个答案。很奇怪。

标签: c# wpf xaml mvvm


【解决方案1】:

如何绑定 ViewModel 集合以填充选项卡控件的标题和内容而不依赖于 TabItem 对象?

试试这个:

查看:

<TabControl ItemsSource="{Binding Items}">
    <TabControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}" />
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Content}" />
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

查看模型:

public class TabViewModel
{
    public TabViewModel()
    {
        Items = new ObservableCollection<Item>()
        {
            new Item { Header = "a", Content = "..." },
            new Item { Header = "b", Content = "..." },
            new Item { Header = "c", Content = "..." },
        };
    }

    public ObservableCollection<Item> Items { get; set; }
}

Item 是一个 POCO 类。

【讨论】:

  • 太好了,成功了。只有一件事我忘了在我的问题中提及。我的内容项本身就是 ViewModel,每个都有一个指示如何呈现它的模板。我已经使用 ItemContainerStyle 很好地设置了标题的模板,但无法弄清楚如何设置内容样式。你知道怎么做吗?
  • @NZJames:请在此处查看我的答案:stackoverflow.com/questions/50353014/…
猜你喜欢
  • 2018-11-25
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
相关资源
最近更新 更多