현재 Enum을 ObjectDataProvider를 통해서 Combobox에 Item 으로 Binding 하여 사용하고 있습니다. 이 Item들에 대해 Tooltip을 만들어서 설명을 띄우고 싶은데, 이런경우 어떻게 해야할까요?
@Vincent 혹시 조금 더 설명해주실 수 있으신가요! ![]()
<ObjectDataProvider x:Key="EPlatform"
MethodName="GetValues"
ObjectType="{x:Type clr:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="awesomeswagenum:ETargetSite"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
...
<dxe:ComboBoxEdit Grid.Column="1"
x:Name="DxCmbSelectPlatform"
ItemsSource="{Binding Source={StaticResource EShopCode}}"
SelectedItem="{Binding ShopCategoryKind}"
IsTextEditable="False"
VerticalContentAlignment="Center"
HorizontalContentAlignment="Center"
FontFamily="{StaticResource MainFont}"
FontSize="17">
<dxe:ComboBoxEdit.StyleSettings>
<dxe:ComboBoxStyleSettings/>
</dxe:ComboBoxEdit.StyleSettings>
</dxe:ComboBoxEdit>
실무에서 사용되는 실제 XAML인데 이런식으로 사용하고 있습니다.
이 경우 Enum값이 View에 보이게 되니까 설명이 없어서 Tooltip을 사용해볼까하는데, 이 경우 어떤식으로 사용해야하는 지 모르겠습니다.
@Vincent DevExpress 설치중입니다. ![]()
이따 한번 확인해볼게요~
와우 ㄷㄷ 감사합니다!!! 사실 데브질문으로 분류되면 데브익스프레스에 질문남기는게 맞는데 ㅎㅎ…; 그냥 WPF 방식으로 해주셔도 충분합니다!
@Vincent 하시려는게 이게 맞을지 모르겠네요… ![]()
<Window>
<Window.Resources>
<ObjectDataProvider x:Key="ODP"
MethodName="GetValues"
ObjectType="{x:Type s:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:Marvel"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<Style TargetType="{x:Type dxe:ComboBoxEditItem}" x:Key="CMBI">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding}"
ToolTip="{Binding}"
Foreground="Red" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<dxe:ComboBoxEdit HorizontalAlignment="Left"
VerticalAlignment="Top" Width="150"
ItemsSource="{Binding Source={StaticResource ODP}}"
ItemContainerStyle="{StaticResource CMBI}"/>
</Grid>
</Window>
네 이거랑 비슷한데 Tooltip에 제가 바인딩하는 Enum에 관한 설명이 부족했네요 ㅎㅎ;;
public enum ERegistState
{
/// <summary>
/// 상품을 막 크롤링 해왔을 때 초기 데이터
/// </summary>
[Display(Name = "Init", Description = "상품을 클롤링한 직후의 데이터")]
Init,
[Display(Name = "Hold", Description = " 보류 상품")]
Hold,
[Display(Name = "ImgHold", Description = "이미지 작업 불가의 이유로 보류된 상품")]
ImgHold,
/// <summary>
/// 등록되지 않은 상품 중에서 수정 중인 것. (등록하다가 오류가 발생한 것도 Edit이며 등록 시 Error Message로 구분함.)
/// </summary>
[Display(Name = "Edit", Description = "보정 작업 진행중인 상품")]
Edit,
/// <summary>
/// 정상 등록완료
/// </summary>
[Display(Name = "Regist", Description = "상품이 쇼피에 등록된 상태")]
Regist,
/// <summary>
/// 티어 세팅 완료
/// </summary>
[Display(Name = "Tier", Description = "상품이 쇼피에 등록된 이후 2Tier처리까지 된 상태")]
Tier,
/// <summary>
/// 할인 적용 완료
/// </summary>
[Display(Name = "Discounted", Description = "상품이 쇼피에 등록된 이후 Discount 까지 적용된 상태")]
Discounted
}
요런식일 때 여기서 Display 어트리뷰트를 XAML로 바인딩해서 보여주고 싶은 것입니다.
예제로 주신 것처럼 하면 Tooltip에 enum값이 찍혀나와서요 ㅎㅎ;;
혼선드려 죄송합니다.
해결했습니다~
알려주신 스타일에 Tooltip에 Converter를 추가했습니다.
도와주셔서 감사합니다.
<dxe:ComboBoxEdit.ItemContainerStyle>
<Style TargetType="{x:Type dxe:ComboBoxEditItem}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding}"
ToolTip="{Binding Converter={StaticResource EnumDisplayConverter}}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</dxe:ComboBoxEdit.ItemContainerStyle>
public class EnumDisplayConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
ERegistState enumValue = (ERegistState)Enum.Parse(typeof(ERegistState), value.ToString());
return AttributeHelper.GetAttribute<DisplayAttribute>(enumValue).Description;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
AttributeHelper.GetAttribute() 메서드는 구글링해서 찾아낸 해당 Enum에 대한 DisplayAttribute를 찾아내는 메서드입니다.
혹시 컨버터에 MarkupExtension을 상속받으면 어떤 이점이 있나요?
이렇게 사용한 경우는 처음이라 어떤 이점이 있는지 궁금합니다 ![]()
엌ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ죄송합니다 아무 이점 없습니다. 삭제할게요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ이거저거 해보다가 안지웠네요 ㅋㅋㅋㅋㅋㅋ
처리하신 방법과 비슷하게
TypeConverter 어트리뷰트를 이용하는 방법도 있으니 참고해 보시는 것도 좋을 것 같습니다.
TypeConverter는 바인딩 대상이 View에 표시 될때 자동으로 참조되서 컨버터를 호출하게 되어
xaml상에 명시적으로 Binding Converter 처리를 하지 않아도 됩니다.![]()
@aroooong 좋은 방법인 것 같습니다!! ![]()
간단하게 샘플 부탁드려도 될까요?
코드는 상준님 예시 코드를 인용했습니다.
[TypeConverter(typeof(EnumDisplayConverter <ESecuritiesCompanyType>))]
public enum ERegistState
{
[Description("상품을 클롤링한 직후의 데이터")]
Init,
[Description("보류 상품")]
Hold,
[Description("이미지 작업 불가의 이유로 보류된 상품")]
ImgHold,
}
public class EnumDescriptionConverter<T> : EnumConverter
{
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
TODO .. 리플렉션을 사용해서 Description어트리뷰트 값 파싱
}
}
ERegistState이 바인딩 처리된 View가 화면에 표시될 때
TypeConverter 어트리뷰트 여부를 판단해서 EnumDescriptionConverter를 호출합니다.
View에 표시되는 내용은 ConvertTo메서드를 오버라이드로 처리 할 수 있습니다.
오호!! 이것도 해보겠습니다 ㅎㅎ 김사합니다!!