열거형 목록을 만드는 MarkupExtension

개요



UWP나 WPF에서 열거형에서 하나의 값을 선택하기 위해 ComboBox나 ListBox를 사용하는 경우가 많습니다.
이 경우 ItemSource에 열거형 값 목록을 포함해야 합니다.
ViewModel이나 다른 자원으로 그 리스트를 준비해도 됩니다만, 어차피 전치를 열거한다면 자동으로 해 주었으면 한다.
거기서 지정한 열거형의 전치를 제공하는 MarkupExtension 를 만듭니다.

※17/11/15추기 보다 고급 방법으로 첨부 속성을 활용하여 SelectedItem에서 자동으로 열거 형 목록을 만드는 방법이 있습니다.

사용방법



ComboBox나 ListBox의 ItemSource에 열거형을 지정한 MarkupExtension을 사용합니다.

아래 샘플 코드에서
ItemSource에 Visibility 열거형을 지정합니다.
게다가 본제와는 관계없지만, TextBlock의 Visibility를 그 ComboBox의 SelctedItem에 Bind하고 있습니다.
ViewModel이나 코드 숨김은 아무것도 쓰지 않으므로 생략합니다.

MainWindow.xaml
<Window
    x:Class="EnumCreateMarkupExtensionTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:EnumCreateMarkupExtensionTest"
    Width="325" Height="150">
    <StackPanel>
        <TextBlock
            Margin="10"
            Background="Red"
            Visibility="{Binding SelectedItem, ElementName=comboBox}" />
        <ComboBox x:Name="comboBox" ItemsSource="{local:EnumCreate Visibility}" />
    </StackPanel>
</Window>

실행 결과



Visible을 선택하면 TextBlock이 표시됩니다.



Collapsed를 선택하면 TextBlock이 숨겨집니다.



MarkupExtension 구현



지정된 형태가 열거형의 경우, GetEnumValues() 로 돌려줄 뿐입니다.

EnumCreateExtension.cs
[MarkupExtensionReturnType(typeof(IEnumerable))]
public class EnumCreateExtension : MarkupExtension
{
    [ConstructorArgument("prefix")]
    public Type Type { get; set; }

    public EnumCreateExtension(Type type)
    {
        this.Type = type;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
        => Type.IsEnum ?
        Type.GetEnumValues() :
        null;
}

환경



VisualStudio2017
.NET Framework 4.7
C#7

좋은 웹페이지 즐겨찾기