현재 Enum을 ObjectDataProvider를 통해서 Combobox에 Item 으로 Binding 하여 사용하고 있습니다. 이 Item들에 대해 Tooltip을 만들어서 설명을 띄우고 싶은데, 이런경우 어떻게 해야할까요?
<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을 사용해볼까하는데, 이 경우 어떤식으로 사용해야하는 지 모르겠습니다.
와우 ㄷㄷ 감사합니다!!! 사실 데브질문으로 분류되면 데브익스프레스에 질문남기는게 맞는데 ㅎㅎ…; 그냥 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 처리를 하지 않아도 됩니다.
코드는 상준님 예시 코드를 인용했습니다.
[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메서드를 오버라이드로 처리 할 수 있습니다.
오호!! 이것도 해보겠습니다 ㅎㅎ 김사합니다!!