Любые предложения, пожалуйста?
Выбранный элемент WPF ComboBox не обновляется
Ответы (2)
Вместо добавления ContentControl непосредственно внутри ComboBox используйте DataTemplate (ItemsTemplate) или ItemContainerStyle. Потому что автоматически сгенерированный ComboBoxItem не знает вашего щелчка, потому что ContentControl съедает Mousedown и скрывает ComboboxItem. Элемент ComboBox отвечает за установку IsSelectedProperty и запуск SelectionChanged.
Я решил эту проблему другим способом.
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;
}
}