0

投稿では、列挙値のカスタム文字列フォーマットを使用して列挙バインドコンボボックスを作成するにはどうすればよいですか?列挙型にスペースを設定する方法は、コンボボックスを文字列値にバインドするときに使用できるスペースを追加できるように、列挙型値に説明を追加する方法を示しています。私の場合、このコンボボックスの選択されたアイテムは別のコントロールにもバインドされています。そのリンクで見つけたソリューションを使用すると、取得している選択したアイテムの値は、スペースを除いた列挙型の値のままです。

私の列挙型は次のようになります

[TypeConverter(typeof(EnumToStringUsingDescription))]
public enum SCSRequestType {       
   [Description ("Change Request")]
   ChangeRequest = 4,

   [Description("Documentation")]
   Documentation = 9,....
}

また、以下のタイプコンバーターを使用しています。

public class EnumToStringUsingDescription : TypeConverter
{
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return (sourceType.Equals(typeof(Enum)));
    }

    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
    {
        return (destinationType.Equals(typeof(String)));
    }

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        return base.ConvertFrom(context, culture, value);
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (!destinationType.Equals(typeof(String)))
        {
            throw new ArgumentException("Can only convert to string.", "destinationType");
        }

        if (!value.GetType().BaseType.Equals(typeof(Enum)))
        {
            throw new ArgumentException("Can only convert an instance of enum.", "value");
        }

        string name = value.ToString();
        object[] attrs =
            value.GetType().GetField(name).GetCustomAttributes(typeof(DescriptionAttribute), false);
        return (attrs.Length > 0) ? ((DescriptionAttribute)attrs[0]).Description : name;
    }
}

ここで何かが足りないのですが、コンボボックスで選択したアイテムを列挙値の説明の値にする方法を教えてください。私はまた、代替案を受け入れています。

4

2 に答える 2

0

私が見つけた最良の方法は、この投稿にあります。マークアップ拡張機能を作成し、コンボボックスにバインドするだけです。

于 2012-08-08T02:16:10.923 に答える
0

または、拡張機能を設定することもできます。public static class Extensions名前空間のトップレベルに作成します。そこで次のメソッドを作成します。

public static string getDescription(this SCSRequestType scs)
{
    switch (scs)
    {
        case SCSRequestType.ChangeRequest:
            return "Change Request";
        case SCSRequestType.Documentation:
            return "Documentation";
        default:
            return null;
    }
}

最後にstring description = SCSRequestType.ChangeRequest.getDescription();、説明にアクセスするために呼び出します。

于 2012-08-08T02:30:30.560 に答える