Bind کردن Enum به ItemsSource در XAML
نویسنده: بزمی
تاریخ: ۱۳۹۲/۰۵/۱۱ ۸:۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
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,
.
.
.
} short? selectedItemInViewModel;
public short? SelectedItemInViewModel
{
get
{
return selectedItemInViewModel;
}
set
{
selectedItemInViewModel = value;
RaisePropertyChanged("SelectedItemInViewModel");
//do calculations if needed
}
}