在使用ItemsSource时添加额外的项目
本文关键字:项目 添加 ItemsSource | 更新日期: 2023-09-27 18:04:15
在我正在构建的项目中,我有一个TabControl
,我想通过ItemsSource
显示一系列选项卡。我还需要在TabControl
开头有一些"概述"选项卡,这些选项卡不能位于ItemsSource
中。
实现这一目标的最佳方法是什么,我能想到的唯一方法是在我的XAML中有我的概述选项卡,并通过代码手动添加选项卡项,而不是使用ItemSource
,这是最好的方法。
您可以使用CompositeCollection
(MSDN)来完成此操作:
<Window.Resources>
<CollectionViewSource x:Key="ExistingTabs" Source="{Binding ExistingTabs}"/>
</Window.Resources>
<TabControl>
<TabControl.ItemsSource>
<CompositeCollection>
<TabItem>SpecialItem</TabItem>
<CollectionContainer Collection="{Binding Source={StaticResource ExistingTabs}}"/>
</CompositeCollection>
</TabControl.ItemsSource>
</TabControl>
为任何人找到使用HeaderTemplate/ContentTemplate与CollectionContainer的方式:
首先在ViewModel中添加Type属性
public Type Type { get { return this.GetType(); } }
使用风格。为由Type属性
标识的动态选项卡设置HeaderTemplate/ContentTemplate的触发器<Window x:Class="TabDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TabDemo"
xmlns:vm="clr-namespace:TabDemo.ViewModel"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525"
d:DataContext="{d:DesignInstance vm:TabViewModel}">
<Window.Resources>
<CollectionViewSource x:Key="ExistingTabs" Source="{Binding ExistingTabs}"/>
<DataTemplate x:Key="TemplateForTheHeader" DataType="{x:Type vm:TabViewModel}">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
<DataTemplate x:Key="TemplateForTheContent" DataType="{x:Type vm:TabViewModel}">
<DockPanel>
<DataGrid ItemsSource="{Binding Data}"></DataGrid>
</DockPanel>
</DataTemplate>
<Style x:Key="TabItemStyle" TargetType="TabItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Type}" Value="{x:Type vm:TabViewModel}">
<Setter Property="HeaderTemplate" Value="{StaticResource TemplateForTheHeader}" />
<Setter Property="ContentTemplate" Value="{StaticResource TemplateForTheContent}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<TabControl Grid.Row="1" ItemContainerStyle="{StaticResource TabItemStyle}">
<TabControl.ItemsSource>
<CompositeCollection>
<TabItem Header="Fixed Header">
<TabItem.Content>
<TextBlock Text="Fixed Content"/>
</TabItem.Content>
</TabItem>
<CollectionContainer Collection="{Binding Source={StaticResource ExistingTabs}}"/>
</CompositeCollection>
</TabControl.ItemsSource>
</TabControl>
</Grid>
</Window>
参考Anderson times的回答:https://stackoverflow.com/a/1348369/1196637
您可以使用CompositeCollection如何在WPF
中向绑定到集合的组合框中添加通用项<TabControl>
<TabControl.ItemsSource>
<CompositeCollection>
<TabItem Header="extra tab item"> //Not bound
<TextBox>something</TextBox>
</TabItem>
<CollectionContainer x:Name="cc"/>
</CompositeCollection>
</TabControl.ItemsSource>
</TabControl>
背后的代码:
cc.Collection=yourObservableCollection
不幸的是,您不能将ItemsSource绑定与显式添加的Items集合对象混合使用。因此,您有两种选择,要么手动将固定项和绑定列表中的项添加到items集合,要么将ItemsSource绑定到包含一组固定对象和绑定集合项的集合。在这两种情况下,最大的问题可能是更新当你的数据变化-确保正确的项目被删除/添加和UI更新正确。