Определить состояние всех дочерних элементов по интерфейсу
Есть форма 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 много и они все разные по наполнению и верстке.