Dies ist eine DevExpress
spezifische Antwort, die auf der am besten bewerteten Antwort von basiert Gregor S.
(derzeit hat sie 128 Stimmen).
Dies bedeutet, dass wir das Styling über die gesamte Anwendung hinweg konsistent halten können:
Leider funktioniert die ursprüngliche Antwort mit einem ComboBoxEdit
von DevExpress ohne einige Änderungen nicht.
Zunächst die XAML für 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"/>
Unnötig zu sagen, müssen Sie zeigen xamlExtensions
auf den Namespace zeigen, der die XAML-Erweiterungsklasse enthält (die unten definiert ist):
xmlns:xamlExtensions="clr-namespace:XamlExtensions"
Und wir müssen zeigen myEnum
auf den Namespace zeigen, der die Aufzählung enthält:
xmlns:myEnum="clr-namespace:MyNamespace"
Dann die Aufzählung:
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
}
}
Das Problem mit der XAML ist, dass wir sie nicht verwenden können SelectedItemValue
, da dies einen Fehler auslöst, da auf den Setter nicht zugegriffen werden kann (ein kleines Versehen von Ihrer Seite DevExpress
). Also müssen wir unsere ändernViewModel
, um den Wert direkt vom Objekt zu erhalten:
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");
}
}
Der Vollständigkeit halber hier die XAML-Erweiterung aus der ursprünglichen Antwort (leicht umbenannt):
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
}
}
Haftungsausschluss: Ich bin nicht mit DevExpress verbunden. Telerik ist auch eine großartige Bibliothek.