C# alpabet上的Wpf排序枚举描述

C# alpabet上的Wpf排序枚举描述,c#,wpf,vb.net,enums,collectionviewsource,C#,Wpf,Vb.net,Enums,Collectionviewsource,我使用枚举的description标记来创建该选项更具可读性的表示形式,例如: ''' <summary> ''' Indicates something cool ''' </summary> <TypeConverter(GetType(EnumDescriptionTypeConverter))> Public Enum MyCoolOptions <Description("B - This brings you to the

我使用枚举的description标记来创建该选项更具可读性的表示形式,例如:

''' <summary>
''' Indicates something cool
''' </summary>
<TypeConverter(GetType(EnumDescriptionTypeConverter))>
Public Enum MyCoolOptions
    <Description("B - This brings you to the moon")>
    AwesomeOption1 = 0

    <Description("A - This brings you to Mars")>
    AwesomeOption2 = 1
End Enum
到目前为止,一切都显示出来了,绑定到一个对象也能正常工作。但是现在我想按字母顺序对枚举的描述进行排序。我有一个很长的清单,所以这将非常有帮助。通常我会连接一个
CollectionViewSource
,如下所示:

<CollectionViewSource x:Key="MyCoolOptionsEnum">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription />
    </CollectionViewSource.SortDescriptions>

    <CollectionViewSource.Source>
        <ObjectDataProvider MethodName="GetName" ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:MyCoolOptions" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </CollectionViewSource.Source>
</CollectionViewSource>

但这只给出从枚举中排序的字符串名称,而不是描述


已经摆弄它一段时间了,但似乎找不到一种方法来解决枚举描述的问题。当然我可以创建一个类对象,然后从中创建某种列表,但在我的例子中,枚举是一个绑定到Usercontrol的对象的属性,在该对象上显示一个组合框,从枚举中获取它的itemsource。

您可以创建这些属性的列表以绑定到您的支持代码和/或VM中,然后您可以删除所有其他不需要的内容。然后如何显示该属性的描述枚举?您可以在支持代码和/或VM中创建一个要绑定到的列表,然后可以删除所有其他不需要的内容。然后如何显示枚举的描述?
Public Class EnumDescriptionTypeConverter
    Inherits EnumConverter

    Public Sub New(ByVal type As Type)
        MyBase.New(type)
    End Sub

    Public Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As Type) As Object
        If destinationType = GetType(String) Then
            If value IsNot Nothing Then
                Dim fi As FieldInfo = value.[GetType]().GetField(value.ToString())
                If fi IsNot Nothing Then
                    Dim attributes As DescriptionAttribute() = CType(fi.GetCustomAttributes(GetType(DescriptionAttribute), False), DescriptionAttribute())
                    Return If(((attributes.Length > 0) AndAlso (Not String.IsNullOrEmpty(attributes(0).Description))), attributes(0).Description, value.ToString())
                End If
            End If

            Return String.Empty
        End If

        Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function
End Class
<CollectionViewSource x:Key="MyCoolOptionsEnum">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription />
    </CollectionViewSource.SortDescriptions>

    <CollectionViewSource.Source>
        <ObjectDataProvider MethodName="GetName" ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:MyCoolOptions" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </CollectionViewSource.Source>
</CollectionViewSource>