Я пытаюсь создать элемент управления ContentControl
(давайте назовем его MyContentControl
), для которого ControlTemplate
будет установлен экземпляром типа DataTemplateSelector
(давайте назовем его MyTemplateSelector
).
Когда я пытаюсь это сделать:
ContentControl contentControl = new ContentControl();
contentControl.ContentTemplateSelector = new MyTemplateSelector();
contentControl.Content = "Some ContentControl Content";
MyContentControl myContentControl = new MyContentControl();
myContentControl.ContentTemplateSelector = new MyTemplateSelector();
myContentControl.Content = "Some MyControl Content";
Я ожидаю, что, когда я устанавливаю содержимое для этих элементов управления, переопределение MyTemplateSelector
метода DataTemplateSelector.SelectTemplate()
вызывается для contentControl
и myContentControl
.
В действительности он вызывается только для contentControl. Что мне нужно сделать (и почему!), Чтобы это работало и для myContentControl
?
(Не уверен, что это актуально, но на данный момент MyContentControl
ничего не делает с DependencyProperties
, кроме переопределения метаданных для DefaultStyleKeyProperty
.
РЕДАКТИРОВАТЬ (перенес содержание из другого сообщения в исходный вопрос):
Вот немного более сложный пример:
Создать MyContentControl:
public class MyContentControl : ContentControl
{
static MyContentControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof (MyContentControl),
new FrameworkPropertyMetadata(typeof (MyContentControl)));
}
public MyContentControl() {}
}
Создать MyTemplateSelector
:
public class MyTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
return null; // <== Place the breakpoint here
}
}
Добавьте ContentControl
и MyContent
элемент управления в главное окно (например):
<StackPanel>
<local:MyContentControl x:Name="myContentControl" />
<ContentControl x:Name="contentControl" />
</StackPanel>
Добавьте этот код где-нибудь после InitializeComponent
(или в обработчике Loaded
):
myContentControl.ContentTemplateSelector = new MyTemplateSelector();
myContentControl.Content = "123";
contentControl.ContentTemplateSelector = new MyTemplateSelector();
contentControl.Content = "ABC";
Точка останова, упомянутая в шаге (2), получает удар только один раз, для элементов content="ABC"
и contentControl
.