派生型のインスタンスによって設定される派生型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
要素に対して 1 回だけヒットします。