Выбранный элемент WPF ComboBox не обновляется - PullRequest
1 голос
/ 22 октября 2009

У меня возникла проблема при работе с WPF ComboBox . Моя ситуация такова, что у меня есть ComboBox, который отображает некоторые значения. Я добавляю ContentControl s к свойству ComboBox 'Items. Я связал Content этих ContentControl с некоторым источником данных, чтобы я мог динамически изменять содержимое. Проблема заключается в том, что содержимое выбранного элемента изменяет элемент в выпадающем списке ComboBox, но элемент в ComboBox SelectionChange остается тем же.

Есть предложения, пожалуйста?

Ответы [ 2 ]

1 голос
/ 23 октября 2009

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

Edit:

В обработчике SelectionChanged evetn 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;
        }
    }
1 голос
/ 22 октября 2009

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

...