ich eine ContentControl
abgeleitete Kontrolle zu bauen bin versucht, (lass es MyContentControl
nennen), die seine ControlTemplate
durch eine Instanz eines DataTemplateSelector
abgeleiteten Typs eingestellt haben (lassen Anruf des es MyTemplateSelector
).WPF DataTemplateSelector.SelectTemplate nicht für einen Contentcontrol-abgeleiteten Typen namens
Wenn ich versuche dies:
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";
erwarte ich, dass, wenn ich Inhalte auf diesen Kontrollen festgelegt, MyTemplateSelector
Überschreibung s‘von DataTemplateSelector.SelectTemplate()
Methode für beide contentControl
und myContentControl
aufgerufen wird.
In Wirklichkeit wird es nur für contentControl aufgerufen. Was muss ich tun (und warum?), Damit es auch für myContentControl
funktioniert?
(nicht sicher, ob es relevant ist, aber für den Moment MyContentControl
tut nichts mit DependencyProperties
andere als DefaultStyleKeyProperty
für Metadaten-Informationen überschrieben
EDIT (Inhalte aus anderen Post ursprüngliche Frage bewegt).
ist hier etwas aufwendigere Beispiel:
MyContentControl erstellen:
public class MyContentControl : ContentControl { static MyContentControl() { DefaultStyleKeyProperty.OverrideMetadata(typeof (MyContentControl), new FrameworkPropertyMetadata(typeof (MyContentControl))); } public MyContentControl() {} }
erstellen
MyTemplateSelector
:public class MyTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { return null; // <== Place the breakpoint here } }
hinzufügen
ContentControl
undMyContent
Kontrolle zu Ihrem Hauptfenster (zum Beispiel):<StackPanel> <local:MyContentControl x:Name="myContentControl" /> <ContentControl x:Name="contentControl" /> </StackPanel>
diesen Code hinzufügen irgendwo nach
InitializeComponent
(oder inLoaded
Handler):myContentControl.ContentTemplateSelector = new MyTemplateSelector(); myContentControl.Content = "123"; contentControl.ContentTemplateSelector = new MyTemplateSelector(); contentControl.Content = "ABC";
Der Haltepunkt in Schritt (2) genannten nur einmal getroffen wird, für content="ABC"
und contentControl
Element.
Danke. Das hat mir einige Münzen gerettet. – dotNET