WPF TabControl未触发未聚焦儿童的已加载事件

时间:2017-08-17 19:46:15

标签: c# wpf data-binding

我有一个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,以及要初始化的视图。#

1 个答案:

答案 0 :(得分:0)

标签会重复使用DataTemplate,这就是您可能只看到一个Loaded事件的原因。它只在第一次加载,然后在切换标签时重复使用。只有绑定的内容才会更改。

而不是在Loaded上收听Grid,而是倾听DataContextChanged,每当DataContext设置为新对象时,它都会告诉您。< / p>

切换标签时,DataContext会发生变化。当前标签将设置为DataContext的{​​{1}}(以及DataTemplate的扩展名。)

使用Grid时,您认为视图将相同,但内容会有所不同。如果不是这种情况,并且视图会根据内容而有所不同,那么您可能需要考虑使用DataTemplate。这将允许您定义多个DataTemplateSelector并根据当前DataTemplate选择其中一个使用DataContext。您可以在Microsoft Docs

中的DataTemplateSelector上阅读