我有一个TabControl
,其中包含ItemsSource
属性的绑定。它绑定到ObservableCollection
。当我向集合中添加项目时,会正确创建选项卡,但只有第一个选项卡会触发其Grid_Loaded
事件。我猜这是因为它的重点。我需要在新选项卡打开时初始化东西,它包含需要引用的控件。
<TabControl x:Name="tabSessions"
ItemsSource="{Binding Sessions}"
SelectedIndex="0"
BorderThickness="0"
Padding="0,0,0,0">
<TabControl.ItemTemplate>
<DataTemplate DataType="{x:Type vm:MyViewModel}">
<TextBlock Margin="4,4,16,4" Text="{Binding Name}"></TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<Grid Loaded="Grid_Loaded">
<!-- View here -->
</Grid>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
是否有可用于初始化此事件的事件?我还需要设置DataContext,以及要初始化的视图。#
答案 0 :(得分:0)
标签会重复使用DataTemplate
,这就是您可能只看到一个Loaded
事件的原因。它只在第一次加载,然后在切换标签时重复使用。只有绑定的内容才会更改。
而不是在Loaded
上收听Grid
,而是倾听DataContextChanged
,每当DataContext
设置为新对象时,它都会告诉您。< / p>
切换标签时,DataContext
会发生变化。当前标签将设置为DataContext
的{{1}}(以及DataTemplate
的扩展名。)
使用Grid
时,您认为视图将相同,但内容会有所不同。如果不是这种情况,并且视图会根据内容而有所不同,那么您可能需要考虑使用DataTemplate
。这将允许您定义多个DataTemplateSelector
并根据当前DataTemplate
选择其中一个使用DataContext
。您可以在Microsoft Docs
DataTemplateSelector
上阅读