Выбранный элемент WPF ComboBox не обновляется


person viky    schedule 22.10.2009    source источник


Ответы (2)


Вместо добавления ContentControl непосредственно внутри ComboBox используйте DataTemplate (ItemsTemplate) или ItemContainerStyle. Потому что автоматически сгенерированный ComboBoxItem не знает вашего щелчка, потому что ContentControl съедает Mousedown и скрывает ComboboxItem. Элемент ComboBox отвечает за установку IsSelectedProperty и запуск SelectionChanged.

person Jobi Joy    schedule 22.10.2009

Я решил эту проблему другим способом.
ComboBox SelectedItem - это не то, что отображается, а то, что вы выбираете. Когда вы выбираете элемент comboBox, ComboBox отображает его в шаблоне SelectionBox, а не в шаблоне SelectedItem. Если вы войдете в VisualTree из ComboBox, вы увидите, что у него есть ContentPresenter, содержащий TextBlock, и этому TextBlock назначается текст выбранного элемента.
Итак, что я сделал, в обработчике событий SelectionChanged я искал TextBlock внутри этого ContentPresenter с помощью VisualTreeHelper, а затем я привязал свойство Text этого TextBlock к свойству Content моего ContentControl (SelectedItem).

Редактировать:

В обработчике событий SelectionChanged ComboBox я написал:

ModifyCombox(cmbAnimationBlocks, myComboBox.SelectedItem.As<ContentControl>());

и этот метод:

    private static void ModifyCombox(DependencyObject comboBox, ContentControl obj)
    {
        if (VisualTreeHelper.GetChildrenCount(comboBox) > 0)
        {
            WalkThroughElement(comboBox, obj);
        }
    }

    private static void WalkThroughElement(DependencyObject element, ContentControl contentControl)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
        {
            if (element.GetType() == typeof(ContentPresenter))
            {
                ContentPresenter contentPresenter = element.As<ContentPresenter>();
                TextBlock textBlock = VisualTreeHelper.GetChild(contentPresenter, 0).As<TextBlock>();
                textBlock.SetBinding(TextBlock.TextProperty, new Binding("Content")
                {
                    Source = contentControl
                });
                contentPresenter.Content = textBlock;
            }
            else
            {
                DependencyObject child = VisualTreeHelper.GetChild(element, i).As<FrameworkElement>();
                WalkThroughElement(child, contentControl);
            }
        }

        if (VisualTreeHelper.GetChildrenCount(element) == 0 && element.GetType() == typeof(ContentPresenter))
        {
            ContentPresenter contentPresenter = element.As<ContentPresenter>();
            TextBlock textBlock = new TextBlock();
            textBlock.SetBinding(TextBlock.TextProperty, new Binding("Content")
            {
                Source = contentControl
            });
            contentPresenter.Content = textBlock;
        }
    }
person viky    schedule 23.10.2009
comment
Пример кода был бы очень полезен. - person WillH; 18.03.2010