WPF, Проблема с TabControl и ComboBox - CodeHelper

WPF, Проблема с TabControl и ComboBox

1

Сегодня обнаружил вот такую штуку. Имеется окно:

<TabControl Name="tcMain" SelectionChanged="tcMain_SelectionChanged">
    <TabItem Header="0"></TabItem>

    <TabItem Header="1">
        <ComboBox Name="cbValues" Width="100" Height="25"></ComboBox>
    </TabItem>
</TabControl>

И обработчик SelectionChanged

private void tcMain_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    switch (tcMain.SelectedIndex)
    {
        case 1:
            cbValues.ItemsSource = null;
            cbValues.ItemsSource = new[] { "1", "2" };
            break;

        default: break;
    }
}

При попытке выбрать значение из ComboBox, файрится события SelectionChanged у TabControl. Я в замешательстве

Лучший ответ:

2

Я не очень много работал с WPF, но описанная вещь — это, вероятно, фишка Routed Events. Суть в том, что событие сгенерированное элементом дерева контролов может быть обработано любым другим вышестоящим элементом в иерархии. В данном случае при изменении в ComboBox возникает событие, которое обрабатывается родительским контейнером.

GarF1eld

да, так и есть. для этого в дочернем обработчике нужно дописать e.Handled = true; - тогда событие не будет всплывать или тунеллироваться дальше. Вообще после WinForms нужно привыкнуть к такой идеологии :)

Новые ответы


0

Это фиче-баг такой. Причем не только с combobox такое. По непонятной здравой логике причине мс решили именно так. Причем давно. Подробности тут. Там же дается и решение, что нужно проверять OriginalSource у события.

0

Можно в обработчике сделать проверку на источник события, добавив следующую строку перед оператором switch

if (e.OriginalSource != tcMain) return;

v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.