1


適切な値の既存のリストを使用して入力したいプロパティを持つクラスに使用する PropertyGrid があります。

これを実現するために、TypeConverter を次のように拡張して、ドロップダウン リストを表示します。

public class BaseDefinitionTypeConverter : TypeConverter
{
    protected Dictionary<string, BaseDefinitionWrapper> mapping = new Dictionary<string, BaseDefinitionWrapper>();

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context) {
        return true; // display drop
    }

    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) {
        return true; // drop-down vs combo
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) {
        mapping.Clear();

        //Since everything is passed in as string a conversion is needed. "mapping" provides for that
        foreach (BaseDefinitionWrapper baseDef in BaseDefinitionWrapper.allWrappers) {
            mapping.Add(baseDef.ToString(), baseDef);
        }

        return new StandardValuesCollection(BaseDefinitionWrapper.allWrappers);
    }

    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
        //sourceType is ALWAYS string
        return sourceType == typeof(string);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {
        //returns the actual selected object to the property grid. value is ALWAYS string.
        return mapping[value.ToString()];
    }
}

次のように使用します。

[TypeConverter(typeof(BaseDefinitionTypeConverter))]
public BaseDefinitionTypeWrapper XYZ {
  get; set;
}

私のバッキング リストが BaseDefinitionWrapper.allWrappers であることがわかります。

質問 #1) StandardValuesCollection の型が異なるのに、CanConvertFrom の sourceType と ConvertFrom の値が常に文字列であるのはなぜですか? PropertyGrid は、ドロップダウン リスト内の要素の toString() メソッドのみを使用し、それを渡すようです。

「GetStandardValues」(baseDef.toString()) での「マッピング」辞書の作成と「ConvertFrom」(value.ToString()) での「マッピング」への呼び出しの間のキー値が実際の値であるという問題があります。キー (パラメーター「値」内) は変更される可能性があり (!)、キーが見つからないため、例外が発生します。しかし後ろの物体は変わらない!

質問 #2) 常に可能であるとは限らない文字列から変換する必要なく、ドロップダウン リストから選択したオブジェクトを取得するにはどうすればよいですか (上記を参照)。ある種の回避策として、このドロップダウン ボックスの選択されたインデックスを取得する方法はありますか?

どうもありがとうございました!

4

0 に答える 0