C# 将viewmodels集合绑定到WPF MVVM选项卡控件
我有一组视图模型,我想绑定到C# 将viewmodels集合绑定到WPF MVVM选项卡控件,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我有一组视图模型,我想绑定到TabControl的ItemsSource属性,并能够动态添加/删除它们,因此实现为一个可观察的 然而,TabControl似乎期望从可视控件对象TabItem继承的类型。我不希望我的ViewModels继承自TabItem,因为这意味着它们需要绑定到可视化实现,并且所有测试都需要作为STA运行 如何绑定ViewModels集合以填充选项卡控件的标题和内容,而不依赖于TabItem对象?Ie仅使用基于ViewModel类型的样式和模板。就像您有一个ListBox并希
TabControl
的ItemsSource
属性,并能够动态添加/删除它们,因此实现为一个可观察的
然而,TabControl
似乎期望从可视控件对象TabItem
继承的类型。我不希望我的ViewModels继承自TabItem
,因为这意味着它们需要绑定到可视化实现,并且所有测试都需要作为STA运行
如何绑定ViewModels集合以填充选项卡控件的标题和内容,而不依赖于TabItem
对象?Ie仅使用基于ViewModel类型的样式和模板。就像您有一个ListBox
并希望使用特定模板直接从viewmodel实例渲染项目一样,通过覆盖ItemTemplate
属性很容易做到这一点
如何使用TabControl
而不使用TabItem
如何绑定ViewModels集合以填充选项卡控件的标题和内容,而不依赖于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; }
}
查看模型:
<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; }
}
public类TabViewModel
{
公共选项卡ViewModel()
{
Items=新的ObservableCollection()
{
新项目{Header=“a”,Content=“…”},
新项{Header=“b”,Content=“…”},
新项目{Header=“c”,Content=“…”},
};
}
公共ObservableCollection项{get;set;}
}
Item
是一个POCO类。那么您想基于集合创建TabItems吗?不确定这是否正是您想要的,但这是我开始使用TabControl时使用的。我只是查了一下这个答案。很奇怪,太好了,我成功了。只有一件事我在问题中忘了提。我的内容项本身就是视图模型,每个视图模型都有一个模板,指示如何呈现它。我已经使用ItemContainerStyle为标题精细设置了模板,但无法确定如何设置内容样式。你知道怎么做吗?@NZJames:请看我的答案: