اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
یک دقیقه
شاید تا به حال در یک برنامه سازمانی نیاز به Bind کردن یک Enum به کنترلهای XAML به چشمتان خورده باشد ، روشی که من برای این کار استفاده میکنم توسط یک Markup Extension به صورت زیر است :
public class ByteEnumerationExtention : MarkupExtension { public ByteEnumerationExtention(Type enumType) { this.enumType = enumType; } private Type enumType; public Type EnumType { get { return enumType; } private set { enumType = value; } } public override object ProvideValue(IServiceProvider serviceProvider) { return (from x in Enum.GetValues(EnumType).OfType<Enum>() select new EnumerationMember { Value = GetValue(x), Description = GetDescription(x) }).ToArray(); } private byte? GetValue(object enumValue) { return Convert.ToByte(enumValue.GetType().GetField("value__").GetValue(enumValue)); } public object GetObjectValue(object enumValue) { return enumValue.GetType().GetField("value__").GetValue(enumValue); } public string GetDescription(object enumValue) { var descAttrib = EnumType.GetField(enumValue.ToString()) .GetCustomAttributes(typeof(DescriptionAttribute), false) .FirstOrDefault() as DescriptionAttribute; return descAttrib != null ? descAttrib.Description : enumValue.ToString(); } } public class EnumerationMember { public string Description { get; set; } public byte? Value { get; set; } }
<ComboBox ItemsSource="{Binding Source={ Extensions:ByteEnumerationExtention {x:Type type:MyEnum} }}" DisplayMemberPath="Description" SelectedValuePath="Value" SelectedValue="{Binding SelectedItemInViewModel}"/>
public enum MyEnum : short { [Description("گزینه 1")] Item1 = 1, [Description("گزینه 2")] Item1 = 2, [Description("گزینه 3")] Item1 = 3, [Description("گزینه 4")] Item1 = 4, [Description("گزینه 5")] Item1 = 5, . . . }
SelectedItem در ViewModel :
short? selectedItemInViewModel; public short? SelectedItemInViewModel { get { return selectedItemInViewModel; } set { selectedItemInViewModel = value; RaisePropertyChanged("SelectedItemInViewModel"); //do calculations if needed } }