Определить состояние всех дочерних элементов по интерфейсу

Есть форма WPF. На ней в сетках и контейнерах расположены кастомные элементы управления под одним интерфейсом.

interface ICheckControl
{
    bool IsChecked { get; set; }
    string Caption { get; set; }
}

Все они расположены нелинейно и не просто "болтаются в корне". Заранее неизвестно сколько таких элементов может быть на форме. Необходимо создать функцию, которая по переданному верхнему родителю возвращала бы количество ICheckControl с IsChecked == true.

Например, текущая проблема: есть фильтры для таблицы реализованные через ICheckControl и они накиданы во вкладки по группам. Каждый раз при любом действии с CheckBox'ами внутри этих компонентов нужно реагировать и показывать в Header вкладки (TabItem) сколько сейчас включено фильтров.

Вижу я это примерно так:

public int CheckedControlsCount(UIElement uie)
{
    int count = 0;
    /*...*/
    if((uie.Children[i] is ICheckControl)&&(((ICheckControl)(uie.Children[i])).IsChecked)) count++;
    /*...*/
    return count;
}

Основной вопрос: как мне пройтись по всем элементам такого плана (ICheckControl) на листьях дерева, корнем которого является переданный UIElement не принимая во внимание остальные элементы.

Вот так примерно выглядит структура нуждающаяся в подобном обходе:

        <TabItem Header="s" Height="30">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                </Grid.ColumnDefinitions>
                <StackPanel Grid.Column="0">
                    <GroupBox Header="d">
                        <StackPanel>
                            <common:CheckCombo Caption="f" ListType="yesornot" SelectedIndex="0"/>
                            <common:CheckCombo Caption="g" ListType="yesornot" SelectedIndex="0"/>
                        </StackPanel>                            
                    </GroupBox>
                    <GroupBox Header="h">
                        <StackPanel>
                            <common:CheckCombo Caption="j" ListType="yesornot" SelectedIndex="0"/>
                            <common:CheckCombo Caption="k" ListType="yesornot" SelectedIndex="0"/>
                            <common:CheckCombo Caption="l" ListType="yesornot" SelectedIndex="0"/>
                            <common:CheckCombo Caption="p" ListType="yesornot" SelectedIndex="0"/>
                        </StackPanel>
                    </GroupBox>
                </StackPanel>
                <StackPanel Grid.Column="1">
                    <GroupBox Header="t" Margin="0 0 0 18">
                        <StackPanel>
                            <common:CheckCombo Caption="q" ListType="yesornot" SelectedIndex="0"/>
                            <common:CheckCombo Caption="w" ListType="yesornot" SelectedIndex="0"/>
                            <common:CheckCombo Caption="e" ListType="yesornot" SelectedIndex="0"/>
                            <common:CheckCombo Caption="r" ListType="yesornot" SelectedIndex="0"/>
                        </StackPanel>
                    </GroupBox>
                    <common:CheckCombo Caption="y" ListType="yesornot" SelectedIndex="0"/>
                    <common:CheckCombo Caption="u" ListType="yesornot" SelectedIndex="0"/>  
                </StackPanel>
                <StackPanel Grid.Column="2">
                    <common:CheckCombo Caption="i" ListType="yesornot" SelectedIndex="0"/>
                    <common:CheckCombo Caption="o" ListType="yesornot" SelectedIndex="0"/>
                </StackPanel>
            </Grid>
        </TabItem>

То есть нужно передать этот TabItem и получить количество всех IsChecked ICheckControl в нем. Таких TabItem много и они все разные по наполнению и верстке.


Ответы (0 шт):