ContentControl は GridView や ListView、ItemsControl などと同じように、Content の内容に応じて ContentTemplate を選択する ContentTempateSelector というプロパティを持っています
しかし、どういうわけか ContentControl は Content が変更されても ContentTemplateSelector による ContentTemplate 選択が再実行されず、テンプレートが残りっぱなしになってしまいます;
そのため、Content が変更されたら ContentTemplateSelector の再実行を行うようにしたコントロールが下記のコード
/// <summary> /// Content 変更時に Template を切り替える ContentControl /// </summary> public class ObservableContentControl : ContentControl { /// <summary> /// Content 変更イベントハンドラ /// </summary> /// <param name="oldContent">古い Content</param> /// <param name="newContent">新しい Content</param> protected override void OnContentChanged(object oldContent, object newContent) { base.OnContentChanged(oldContent, newContent); if (this.ContentTemplateSelector == null) { return; } this.OnContentTemplateSelectorChanged(null, this.ContentTemplateSelector); } }
簡単ですね!