C# WPF如何将带有说明的枚举绑定到组合框
如何将带有C# WPF如何将带有说明的枚举绑定到组合框,c#,wpf,combobox,devexpress,enumeration,C#,Wpf,Combobox,Devexpress,Enumeration,如何将带有说明(DescriptionAttribute)的enum绑定到组合框 我得到了一个枚举: public enum ReportTemplate { [Description("Top view")] TopView, [Description("Section view")] SectionView } 我试过这个: <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type
说明(DescriptionAttribute
)的enum
绑定到组合框
我得到了一个枚举
:
public enum ReportTemplate
{
[Description("Top view")]
TopView,
[Description("Section view")]
SectionView
}
我试过这个:
<ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type System:Enum}"
x:Key="ReportTemplateEnum">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="Helpers:ReportTemplate"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<Style x:Key="ReportTemplateCombobox" TargetType="dxe:ComboBoxEditSettings">
<Setter Property="ItemsSource"
Value="{Binding Source={x:Type Helpers:ReportTemplate}}"/>
<Setter Property="DisplayMember" Value="Description"/>
<Setter Property="ValueMember" Value="Value"/>
</Style>
不能成功做到这一点,有什么简单的解决办法吗
提前谢谢 这可以通过使用组合框的转换器和项目模板来完成
以下是转换器代码,绑定到枚举时将返回描述值:
namespace FirmwareUpdate.UI.WPF.Common.Converters
{
public class EnumDescriptionConverter : IValueConverter
{
private string GetEnumDescription(Enum enumObj)
{
FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());
object[] attribArray = fieldInfo.GetCustomAttributes(false);
if (attribArray.Length == 0)
{
return enumObj.ToString();
}
else
{
DescriptionAttribute attrib = attribArray[0] as DescriptionAttribute;
return attrib.Description;
}
}
object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Enum myEnum = (Enum)value;
string description = GetEnumDescription(myEnum);
return description;
}
object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return string.Empty;
}
}
}
然后在xaml中,您需要使用和项模板
<ComboBox Grid.Row="1" Grid.Column="1" Height="25" Width="100" Margin="5"
ItemsSource="{Binding Path=MyEnums}"
SelectedItem="{Binding Path=MySelectedItem}"
>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Converter={StaticResource enumDescriptionConverter}}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
公共枚举报告模板
{
[说明(“俯视图”)]
俯视图=1,
[说明(“剖面视图”)]
截面视图=2
}
ComboBoxEditSettings.ItemsSource=EnumHelper.GetAllValuesAndDescriptions(新)
列表{ReportTemplate.Top_视图,ReportTemplate.Section_视图});
RSmaller有一个很好的答案,也是我使用的答案,但有一个警告。如果枚举上有多个属性,并且Description不是第一个列出的属性,那么他的“GetEnumDescription”方法将抛出异常
以下是一个稍微安全的版本:
private string GetEnumDescription(Enum enumObj)
{
FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());
object[] attribArray = fieldInfo.GetCustomAttributes(false);
if (attribArray.Length == 0)
{
return enumObj.ToString();
}
else
{
DescriptionAttribute attrib = null;
foreach( var att in attribArray)
{
if (att is DescriptionAttribute)
attrib = att as DescriptionAttribute;
}
if (attrib != null )
return attrib.Description;
return enumObj.ToString();
}
}
关于另一种方法,请参见MyEnums和MySelectedItem?
private string GetEnumDescription(Enum enumObj)
{
FieldInfo fieldInfo = enumObj.GetType().GetField(enumObj.ToString());
object[] attribArray = fieldInfo.GetCustomAttributes(false);
if (attribArray.Length == 0)
{
return enumObj.ToString();
}
else
{
DescriptionAttribute attrib = null;
foreach( var att in attribArray)
{
if (att is DescriptionAttribute)
attrib = att as DescriptionAttribute;
}
if (attrib != null )
return attrib.Description;
return enumObj.ToString();
}
}