XAML에서 자신의 클래스 이름을 얻는 MarkupExtension

개요



XAML만으로 자신의 클래스 이름을 얻는 MarkupExtension의 설명입니다.
예를 들어 MainWindow.xaml 내에 있으면 "MainWindow"라는 문자열을 자동으로 얻을 수 있습니다.
코드(C#)로 쓰면 this.GetType().Name 입니다만, XAML만으로 하는 방법이 간단하게는 모르기 때문에 소개합니다.

사용방법



Window의 Title과 내부의 TextBlock에 후술하는 MarkupExtension를 지정합니다.

MainWindow.xaml
<Window
    x:Class="WpfApp3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApp3"
    Width="300" Height="100"
    Title="{local:RootName}" >
    <TextBlock Text="{local:RootName}"/>
</Window>

결과



직접 문자열로 지정하지 않아도 "MainWindow"가 표시됩니다.


MarkupExtension 구현



RootNameExtension.cs
[MarkupExtensionReturnType(typeof(string))]
public class RootNameExtension : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var provideValueTarget = serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
        var rootObj = provideValueTarget?.RootObject;
        return rootObj?.GetType().Name;
    }
}

주의점



디자이너 때에는 반영되지 않습니다.
이는 런타임과 디자인 타임에 serviceProvider가 다르기 때문입니다.



환경



VisualStudio2017
.NET Framework 4.6
C#6

좋은 웹페이지 즐겨찾기