열거형 목록을 만드는 MarkupExtension
4753 단어 VisualStudio.NETWPFXamlC#
개요
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
Reference
이 문제에 관하여(열거형 목록을 만드는 MarkupExtension), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/soi/items/6f36cb095af81500e8cb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
Reference
이 문제에 관하여(열거형 목록을 만드는 MarkupExtension), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/soi/items/6f36cb095af81500e8cb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
지정된 형태가 열거형의 경우,
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
Reference
이 문제에 관하여(열거형 목록을 만드는 MarkupExtension), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/soi/items/6f36cb095af81500e8cb
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(열거형 목록을 만드는 MarkupExtension), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/soi/items/6f36cb095af81500e8cb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)