Il s'agit d'une DevExpress
réponse spécifique basée sur la réponse la plus votée de Gregor S.
(actuellement, elle compte 128 voix).
Cela signifie que nous pouvons garder le style cohérent dans toute l'application:
Malheureusement, la réponse originale ne fonctionne pas avec un ComboBoxEdit
de DevExpress sans quelques modifications.
Tout d'abord, le XAML pour 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"/>
Inutile de dire que vous devrez pointer xamlExtensions
vers l'espace de noms qui contient la classe d'extension XAML (définie ci-dessous):
xmlns:xamlExtensions="clr-namespace:XamlExtensions"
Et nous devons pointer myEnum
vers l'espace de noms qui contient l'énumération:
xmlns:myEnum="clr-namespace:MyNamespace"
Ensuite, l'énumération:
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
}
}
Le problème avec le XAML est que nous ne pouvons pas l'utiliser SelectedItemValue
, car cela génère une erreur car le setter est inaccessible (peu d'oubli de votre part, DevExpress
). Nous devons donc modifier notre ViewModel
pour obtenir la valeur directement à partir de l'objet:
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");
}
}
Pour être complet, voici l'extension XAML de la réponse d'origine (légèrement renommée):
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
}
}
Avertissement: je n'ai aucune affiliation avec DevExpress. Telerik est également une excellente bibliothèque.