しっぽを追いかけて

ぐるぐるしながら考えています

Unity と猫の話題が中心   掲載内容は個人の私見であり、所属組織の見解ではありません

ContentControl の Content が変わったら Template を更新するようにする

ContentControl は GridView や ListView、ItemsControl などと同じように、Content の内容に応じて ContentTemplate を選択する ContentTempateSelector というプロパティを持っています

f:id:matatabi_ux:20140427143716p:plain

しかし、どういうわけか 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);
    }
}

簡単ですね!