Я решил эту проблему другим способом.
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;
}
}