Đây là một DevExpress
câu trả lời cụ thể dựa trên câu trả lời được bình chọn hàng đầu bởiGregor S.
(hiện tại nó có 128 phiếu).
Điều này có nghĩa là chúng ta có thể giữ kiểu dáng nhất quán trên toàn bộ ứng dụng:
Thật không may, câu trả lời ban đầu không hoạt động với ComboBoxEdit
DevExpress mà không có một số sửa đổi.
Đầu tiên, XAML cho 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"/>
Không cần phải nói, bạn sẽ cần trỏ xamlExtensions
vào không gian tên chứa lớp mở rộng XAML (được định nghĩa bên dưới):
xmlns:xamlExtensions="clr-namespace:XamlExtensions"
Và chúng ta phải chỉ myEnum
vào không gian tên chứa enum:
xmlns:myEnum="clr-namespace:MyNamespace"
Sau đó, 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
}
}
Vấn đề với XAML là chúng tôi không thể sử dụng SelectedItemValue
, vì điều này gây ra lỗi vì trình cài đặt không thể truy cập được (phần giám sát của bạn, DevExpress
). Vì vậy, chúng tôi phải sửa đổi ViewModel
để có được giá trị trực tiếp từ đối tượng:
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");
}
}
Để đầy đủ, đây là phần mở rộng XAML từ câu trả lời ban đầu (được đổi tên một chút):
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
}
}
Tuyên bố miễn trừ trách nhiệm: Tôi không có liên kết với DevExpress. Telerik cũng là một thư viện tuyệt vời.