WPF TabControl дочерние элементы

Это мой текущий сценарий: у меня есть несколько пользовательских элементов управления внутри разных TabItems в одном TabControl в окне WPF. Что-то типа:

<Window x:Class="MainWindow"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
Title="S.C.A.R" WindowState="Maximized">  
    <TabControl Name="MainTabControl">  
        <TabItem Name="TabOps">  
            <Grid>  
                <Grid.RowDefinitions>  
                    <RowDefinition/>  
                    <RowDefinition/>  
                    <RowDefinition/>  
                    <RowDefinition Height="20"/>  
                </Grid.RowDefinitions>  
                <Grid.ColumnDefinitions>  
                    <ColumnDefinition/>  
                    <ColumnDefinition Width="30"/>  
                    <ColumnDefinition/>  
                </Grid.ColumnDefinitions>  
                <Local:ServiceList Height="Auto" CanInsert="True" CanCollapse="True" Grid.ColumnSpan="3" x:Name="SL" RecordState="Edit"/>  
                <Local:ReservationList CanCollapse="True" Grid.Row="1"  RecordState="Edit" x:Name="RL"/>  
                <Local:DriverList CanDelete="False" CanInsert="False"   CanCollapse="True" Grid.Row="1" Grid.Column="2" RecordState="Edit" x:Name="DL"/>  
                <Local:CustomerForm CanDelete="False" CanInsert="False" Grid.Row="2"   Grid.ColumnSpan="3" RecordState="View" x:Name="CL"/>  
                </Grid>  
        </TabItem>  
        <TabItemItem Name="TabCodes">  
                <Local:CustomerList x:Name="CustomerCRUD" RecordState="View"/>  
         </TabItem>  
        <Button Grid.Row="1"  Content="TEST" Click="Button_Click"/>  
    </Grid>  
</Border>  
</Window>  

Извините за отступ. По какой-то причине я не могу получить здесь правильный отступ кода :(

Что мне нужно сделать, так это определить (желательно в методе TabControl.Load, какие из моих различных пользовательских элементов управления видны в данный момент. Мне нужно сделать это динамическим способом, я не могу жестко запрограммировать отношения между элементами TabItems и их дети, что-то вроде: if (TabControl.SelectedItem is XXXX)... здесь невозможно, потому что это динамический пользовательский интерфейс, и я не могу узнать, какие элементы управления находятся впереди.

Я немного покопался и обнаружил, что элементы управления TabItem не отображаются в визуальном дереве их «потомков». Я вижу только ContentPresenter, а потом саму TabControl. Похоже, что tabItems не «содержат» своего собственного контента, поэтому я не мог, например, сделать FindAncestor для элементов Tab.

Еще один интересный факт заключается в том, что событие Loaded моих пользовательских элементов управления вызывается при запуске. Независимо от того, видны они на экране или нет.

Идеальным сценарием будет поиск события, которое запускается только в моих пользовательских элементах управления, когда выбирается TabItem, под которым они находятся.

Цените любые идеи. заранее спасибо


person Federico Berasategui    schedule 16.03.2011    source источник
comment
Вы приравниваете видимый в данный момент к выбранному элементу TabItem? Если это так, то динамический или нет, вы можете получить то, что вам нужно, на основе выбранной вкладки.   -  person Aaron McIver    schedule 16.03.2011
comment
Я пробовал это, но поскольку элементы TabItem не отображаются в визуальном дереве пользовательских элементов управления, я не могу найти способ узнать, является ли текущий выбранный элемент вкладки тем, к которому принадлежат мои пользовательские элементы управления. Поэтому я не могу определить, какие пользовательские элементы управления мне нужно предоставить (путем выполнения запросов на бизнес-уровне для вывода данных на экран).   -  person Federico Berasategui    schedule 16.03.2011
comment
@HighCore Являются ли контейнеры TabItems для UserControls, где UserControl хранится в свойстве Content TabItem?   -  person Aaron McIver    schedule 16.03.2011
comment
UserControls всегда будут внутри TabItems, они всегда будут внутри визуального дерева содержимого TabItems, однако утверждение TabItem.Content == MyUserControl не всегда истинно, на самом деле, скорее всего, будет Grid или StackPanel, DockPanel или любой другой промежуточный контейнер.   -  person Federico Berasategui    schedule 16.03.2011
comment
По этой причине я не могу сделать что-то вроде TabItem.GetAllUserControls, потому что нет способа определить, где в визуальном дереве будут расположены эти элементы управления, может случиться, что у него есть сетка с док-панелью внутри, затем вторая сетка, затем Пользовательский контроль   -  person Federico Berasategui    schedule 16.03.2011
comment
@HighCore Если он всегда находится в свойстве Content (независимо от уровня), найдите TabItem, используя что-то вроде этого... stackoverflow.com/questions/974598/, где вы предоставляете возвращаемый объект TabItem.Content и ищете указанный вами тип, UserControl в данном случае.   -  person Aaron McIver    schedule 16.03.2011
comment
Здорово! Благодарность! Я просто искал что-то подобное, я нашел похожее решение, но это было много кода, и мне это не нравилось с точки зрения производительности. Это очень просто. Спасибо!   -  person Federico Berasategui    schedule 16.03.2011
comment
@HighCore Добавлено в качестве ответа для тех, кто наткнулся на этот вопрос; йв   -  person Aaron McIver    schedule 16.03.2011


Ответы (1)


Вы должны иметь возможность использовать VisualTreeHelper и, следовательно, этот ответ на SO, чтобы предоставить возвращаемый объект TabItem.Content и искать указанный вами тип, UserControl в этом случае.

ПРИМЕЧАНИЕ:

Для получения дополнительной информации см. комментарии, которые появились в вопросе SO.

person Aaron McIver    schedule 16.03.2011