我想创建一个可变数量的选项卡,然后通过代码填充它们。此XAML代码基于集合Channels正确生成选项卡,该集合包含只有Name属性的匿名对象:
<ItemsControl
Name="ChannelTabs"
ItemsSource="{Binding Path=Channels}"
>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Name="Channels"
HorizontalAlignment="Stretch"
Width="auto"
Columns="2"
/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<DataTemplate.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="18"/>
<Setter Property="HorizontalAlignment"
Value="Center"/>
</Style>
</DataTemplate.Resources>
<TabItem
Header="{Binding Path=Name}"
Tag="{Binding Path=Name}"
VerticalAlignment="Top"
HorizontalAlignment="Stretch"
MinWidth="60"
Width="auto"
Margin="5,5,5,5"
Grid.Row="1" Grid.Column="1"
>
<WrapPanel />
</TabItem>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
字符串
但是,现在我需要填充这些选项卡,因此需要按Name查找它们。我尝试这样做是为了找到Tag等于字符串ch_name的TabItem:
TabItem tab = (Panel)ChannelTabs.Items.Items.Cast<TabItem>().First(ti => (string)ti.Tag == ch_name);
型
...但我得到一个错误,因为我不能将匿名对象强制转换为TabItem。显然,Items属性并不像我预期的那样包含TabItem对象,而是包含匿名对象。换句话说,它包含与ItemsSource相同的内容。
如何访问从ItemsSource集合创建的实际TabItems,而不是ItemsSource本身?
2条答案
按热度按时间dnph8jn41#
可以通过ItemsControl的项容器元素轻松访问TabItem。
item容器是一个ContentPresenter,可以通过
ItemContainerGenerator
及其ContainerFromItem
或ContainerFromIndex
方法使用:字符串
TabItem是容器的第一个子级:
型
vhmi4jdf2#
要获取选项卡项目,您需要访问
TabPanel
,它是选项卡项目的容器。要访问
TabPanel
,您应该处理Loaded
事件,并将对象添加到一个变量中,以便稍后引用。在你的tab控件中添加下面的setter字符串
并在事件处理程序中将其添加到变量
型
在你的函数中你想得到选项卡项
型