[WPF] Enum Tooltip Binding

현재 Enum을 ObjectDataProvider를 통해서 Combobox에 Item 으로 Binding 하여 사용하고 있습니다. 이 Item들에 대해 Tooltip을 만들어서 설명을 띄우고 싶은데, 이런경우 어떻게 해야할까요?

1개의 좋아요

@Vincent 혹시 조금 더 설명해주실 수 있으신가요! :smile:

1개의 좋아요
<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을 사용해볼까하는데, 이 경우 어떤식으로 사용해야하는 지 모르겠습니다.

1개의 좋아요

@Vincent DevExpress 설치중입니다. :smile:
이따 한번 확인해볼게요~

1개의 좋아요

와우 ㄷㄷ 감사합니다!!! 사실 데브질문으로 분류되면 데브익스프레스에 질문남기는게 맞는데 ㅎㅎ…; 그냥 WPF 방식으로 해주셔도 충분합니다!

1개의 좋아요

@Vincent 하시려는게 이게 맞을지 모르겠네요… :disappointed_relieved:

<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>
2개의 좋아요

네 이거랑 비슷한데 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값이 찍혀나와서요 ㅎㅎ;;
혼선드려 죄송합니다.

1개의 좋아요

해결했습니다~
알려주신 스타일에 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를 찾아내는 메서드입니다.

3개의 좋아요

혹시 컨버터에 MarkupExtension을 상속받으면 어떤 이점이 있나요?

이렇게 사용한 경우는 처음이라 어떤 이점이 있는지 궁금합니다 :thinking:

1개의 좋아요

엌ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ죄송합니다 아무 이점 없습니다. 삭제할게요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ이거저거 해보다가 안지웠네요 ㅋㅋㅋㅋㅋㅋ

1개의 좋아요

처리하신 방법과 비슷하게

TypeConverter 어트리뷰트를 이용하는 방법도 있으니 참고해 보시는 것도 좋을 것 같습니다.
TypeConverter는 바인딩 대상이 View에 표시 될때 자동으로 참조되서 컨버터를 호출하게 되어
xaml상에 명시적으로 Binding Converter 처리를 하지 않아도 됩니다.:slight_smile:

3개의 좋아요

@aroooong 좋은 방법인 것 같습니다!! :smile:

간단하게 샘플 부탁드려도 될까요?

1개의 좋아요

코드는 상준님 예시 코드를 인용했습니다.

[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메서드를 오버라이드로 처리 할 수 있습니다.

4개의 좋아요

오호!! 이것도 해보겠습니다 ㅎㅎ 김사합니다!!

1개의 좋아요