6

私はクラスを持っています:

public class Filter
{
    public Filter (string name, string value)
    {
        Name = name;
        Value = value;
    }

    public string Name {get; private set;}
    public string Value {get; set;}
}

コレクションクラス:

public class FilterCollection : Collection<Filter>
{
   // code elided
}

私のコンポーネントクラス:

public class MyComponent : Component
{
    // ...

    [Editor(typeof(FilterEditor), typeof(UITypeEditor))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public FilterCollection Filters { get; set; }

    // ...
}

問題は、コレクションがデザイナーによって正しくシリアル化されていないことです。

私は何かが欠けていると確信していますが、何がわかりません。

追加情報

designer.cs ファイルに含めたいのは、次のようなものです。

myComponent.Filters.Add (new Filter ("some name", "some value"));
myComponent.Filters.Add (new Filter ("other name", "other value"));

これは実現可能ですか?

4

1 に答える 1

3

わかりました、問題は解決しました。

FilterクラスにTypeConverterを使用する必要がありました。

internal class FilterConverter : TypeConverter
{
    public override bool CanConvertTo (ITypeDescriptorContext context, Type destinationType)
    {
        return destinationType == typeof(InstanceDescriptor) || base.CanConvertTo (context, destinationType);
    }

    public override object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(InstanceDescriptor) && value is Filter)
        {
            ConstructorInfo constructor = typeof (Filter).GetConstructor (new[] {typeof (string), typeof (string)});

            var filter = value as Filter;
            var descriptor = new InstanceDescriptor (constructor, new[] {filter.Name, filter.Value}, true);

            return descriptor;
        }
        return base.ConvertTo (context, culture, value, destinationType);
    }
}

コンバーターは、次のようにFilterクラスに追加されます。

[TypeConverter(typeof(FilterConverter))]
public class Filter
{
    // ...
}

ここで注意すべき重要なことは、Filterコンストラクターに必要なパラメーターを使用してインスタンス記述子を作成することです。また、 InstanceDescriptorコンストラクターの最後のパラメーター ( isComplete )をtrueに設定する必要があります。

于 2012-05-02T20:35:24.787 に答える