Ini adalah DevExpressjawaban spesifik berdasarkan jawaban terpilih teratas Gregor S.(saat ini memiliki 128 suara).
Ini berarti kami dapat menjaga gaya konsisten di seluruh aplikasi:

Sayangnya, jawaban asli tidak bekerja dengan ComboBoxEditdari DevExpress tanpa beberapa modifikasi.
Pertama, XAML untuk ComboBoxEdit:
<dxe:ComboBoxEdit ItemsSource="{Binding Source={xamlExtensions:XamlExtensionEnumDropdown {x:myEnum:EnumFilter}}}"
SelectedItem="{Binding BrokerOrderBookingFilterSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
DisplayMember="Description"
MinWidth="144" Margin="5"
HorizontalAlignment="Left"
IsTextEditable="False"
ValidateOnTextInput="False"
AutoComplete="False"
IncrementalFiltering="True"
FilterCondition="Like"
ImmediatePopup="True"/>
Tidak perlu dikatakan, Anda harus menunjuk xamlExtensionspada namespace yang berisi kelas ekstensi XAML (yang didefinisikan di bawah):
xmlns:xamlExtensions="clr-namespace:XamlExtensions"
Dan kita harus menunjuk myEnumpada namespace yang berisi enum:
xmlns:myEnum="clr-namespace:MyNamespace"
Kemudian, enum:
namespace MyNamespace
{
public enum EnumFilter
{
[Description("Free as a bird")]
Free = 0,
[Description("I'm Somewhat Busy")]
SomewhatBusy = 1,
[Description("I'm Really Busy")]
ReallyBusy = 2
}
}
Masalah dengan XAML adalah bahwa kita tidak dapat menggunakan SelectedItemValue, karena ini melempar kesalahan karena setter tidak dapat diakses (sedikit kelalaian pada bagian Anda, DevExpress). Jadi kita harus memodifikasi kita ViewModeluntuk mendapatkan nilai langsung dari objek:
private EnumFilter _filterSelected = EnumFilter.All;
public object FilterSelected
{
get
{
return (EnumFilter)_filterSelected;
}
set
{
var x = (XamlExtensionEnumDropdown.EnumerationMember)value;
if (x != null)
{
_filterSelected = (EnumFilter)x.Value;
}
OnPropertyChanged("FilterSelected");
}
}
Untuk kelengkapan, berikut adalah ekstensi XAML dari jawaban asli (sedikit diganti namanya):
namespace XamlExtensions
{
/// <summary>
/// Intent: XAML markup extension to add support for enums into any dropdown box, see http://bit.ly/1g70oJy. We can name the items in the
/// dropdown box by using the [Description] attribute on the enum values.
/// </summary>
public class XamlExtensionEnumDropdown : MarkupExtension
{
private Type _enumType;
public XamlExtensionEnumDropdown(Type enumType)
{
if (enumType == null)
{
throw new ArgumentNullException("enumType");
}
EnumType = enumType;
}
public Type EnumType
{
get { return _enumType; }
private set
{
if (_enumType == value)
{
return;
}
var enumType = Nullable.GetUnderlyingType(value) ?? value;
if (enumType.IsEnum == false)
{
throw new ArgumentException("Type must be an Enum.");
}
_enumType = value;
}
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var enumValues = Enum.GetValues(EnumType);
return (
from object enumValue in enumValues
select new EnumerationMember
{
Value = enumValue,
Description = GetDescription(enumValue)
}).ToArray();
}
private string GetDescription(object enumValue)
{
var descriptionAttribute = EnumType
.GetField(enumValue.ToString())
.GetCustomAttributes(typeof (DescriptionAttribute), false)
.FirstOrDefault() as DescriptionAttribute;
return descriptionAttribute != null
? descriptionAttribute.Description
: enumValue.ToString();
}
#region Nested type: EnumerationMember
public class EnumerationMember
{
public string Description { get; set; }
public object Value { get; set; }
}
#endregion
}
}
Penafian: Saya tidak memiliki afiliasi dengan DevExpress. Telerik juga merupakan perpustakaan yang bagus.