デフォルトのコレクションエディターやカスタムUIエディターでプロパティのsetアクセサーを呼び出すことはできますか?

StackOverflow https://stackoverflow.com/questions/1209452

質問

プログラムのネイティブオブジェクトの属性を指定するカスタムクラスがあるアプリケーション用のプラグインを書いています。 APIを使用すると、ネイティブファイル内のオブジェクトとの間でキー付き文字列を直接読み書きできます。そのため、プログラム内のネイティブオブジェクトとの間でこれらのユーザー文字列を読み書きする各プロパティのGetおよびSetアクセサーのプライベートフィールドを読み書きするのではなく、

ユーザーは、PropertyGridコントロールを介してこれらのプロパティにアクセスします。これまでのところ、カスタムオブジェクトタイプ( Floor )のカスタムコレクション( FloorCollection )を保存する必要がある場合を除き、これは単純なプロパティですべて正常に機能しています。

だから、 XmlSerializer を使用してプロパティを設定しました。 GETアクセサーはネイティブオブジェクトからユーザー文字列を読み取り、文字列はFloorCollectionのインスタンスに逆シリアル化されます。 SETアクセサーは、 FloorCollection のインスタンスを読み取り、それをユーザー文字列にシリアル化することにより、その逆を行います。

私のプロパティは次のようになります。

public FloorCollection Floors
{
    get 
    {
        string oldString = this.GetBaseObjUserString("CPFloors");
        if (oldString == null) return null;

        XmlSerializer serializer = new XmlSerializer(typeof(FloorCollection));
        StringReader strReader = new StringReader(oldString);

        FloorCollection newCollection =                 
        (FloorCollection)serializer.Deserialize(strReader);
        return newCollection;
    }

    set 
    {
        FloorCollection newCol = value;

        if (newCol == null) return;

        //serializes new collection
        XmlSerializer serializer = new XmlSerializer(typeof(FloorCollection));
        StringWriter sw = new StringWriter();

        serializer.Serialize(sw, newCol);

        string newString = sw.ToString();

        this.SetBaseObjUserString("CPFloors", newString);
    }
}

デフォルトのコレクションエディタで PropertGrid を使用して、このコレクションプロパティを開くことができます。ただし、デフォルトのコレクションエディターは、GETアクセサーが提供する参照でコレクションを編集するだけで、SETアクセサーを呼び出してオブジェクトに保存します。したがって、デフォルトのエディターでコレクションを編集できますが、エディターを閉じて再度開いても、コレクションをネイティブオブジェクトのユーザー文字列にシリアル化するためにSETアクセサーが呼び出されることはないため、コレクションは変更されません。

デフォルトのコレクションエディターを変更して、プロパティのsetアクセサーを呼び出すことはできますか?プロパティのカスタム UITypeEditor をセットアップした場合、プロパティセットアクセサーを使用してプロパティに保存する方法はありますか?または、コレクションプロパティにアクセスしているコードに、参照ではなく値でプロパティをGETおよびSETすることを強制する他の方法はありますか?

役に立ちましたか?

解決

XML Serializerがコレクションの set アクセサーを呼び出すとは思わない。代わりに、 get アクセサーから取得するコレクションインスタンスのAddメソッドを呼び出すだけです。

コレクションを変更するには、コレクションタイプでAddメソッドやRemoveメソッドなどをオーバーライドし、変更したコレクションをユーザープロパティにシリアル化する必要があると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top