#c# #wpf #vb.net #enums #collectionviewsource
#c# #wpf #vb.net #перечисления #collectionviewsource
Вопрос:
Я использую тег 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
На стороне Xaml я привязал его к локальному перечислению следующим образом:
<ComboBox ItemsSource="{Binding Source={local:EnumBindingSource {x:Type local:MyCoolOptions}}}"
Затем я использую преобразователь типов для отображения описания вместо строкового имени перечисления следующим образом:
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
вот так:
<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 из перечисления.
Комментарии:
1. Вы можете создать список из них для привязки к своему резервному коду и / или виртуальной машине, а затем удалить все остальное, поскольку оно не требуется.
2. Как бы тогда показать описание перечисления?