यह एक DevExpress
विशिष्ट उत्तर है, Gregor S.
(वर्तमान में इसमें 128 मत हैं) शीर्ष मत पर दिए गए उत्तर के आधार पर ।
इसका मतलब है कि हम स्टाइल को पूरे एप्लिकेशन के अनुरूप रख सकते हैं:
दुर्भाग्य से, मूल उत्तर के साथ काम नहीं करता है ComboBoxEdit
देवएक्सप्रेस से कुछ संशोधनों के बिना ।
सबसे पहले, के लिए XAML 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"/>
कहने की जरूरत नहीं है, आपको xamlExtensions
उन नामस्थान पर इंगित करना होगा, जिसमें XAML एक्सटेंशन क्लास (जो नीचे परिभाषित है):
xmlns:xamlExtensions="clr-namespace:XamlExtensions"
और हमें myEnum
उन नामस्थानों की ओर संकेत करना होगा , जिनमें एनम है:
xmlns:myEnum="clr-namespace:MyNamespace"
फिर, एनम:
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
}
}
एक्सएएमएल के साथ समस्या यह है कि हम इसका उपयोग नहीं कर सकते हैं SelectedItemValue
, क्योंकि यह एक त्रुटि फेंकता है क्योंकि सेटर अस्वीकार्य है (आपके हिस्से पर एक नज़र का थोड़ा सा DevExpress
)। इसलिए हमें अपने ViewModel
ऑब्जेक्ट से सीधे मूल्य प्राप्त करने के लिए संशोधित करना होगा:
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");
}
}
पूर्णता के लिए, यहां मूल उत्तर (थोड़ा नाम बदला) से XAML एक्सटेंशन है:
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
}
}
डिस्क्लेमर: मेरा DevExpress से कोई जुड़ाव नहीं है। Telerik भी एक महान पुस्तकालय है।