2

特定の種類のコントロールを追加のプロパティで拡張するエクステンダー (IExtenderProvider) があります。これらのプロパティの 1 つについて、UITypeEditor を作成しました。これまでのところ、すべて正常に動作しています。

エクステンダーには、UITypeEditor の一種のデフォルトとして使用しようとしているプロパティ自体もいくつかあります。私がしたいのは、(拡張コントロールではなく) エクステンダー自体にプロパティを設定できるようにすることです。拡張コントロールの追加プロパティの 1 つで UITypeEditor を開くと、 UITypeEditor をエクステンダーのプロパティの値に設定します。

簡単な例: ExtenderProvider にはプロパティ DefaultExtendedValue があります。フォームで、このプロパティの値を「My Value」に設定しました。拡張コントロールには、プロバイダーを通じて、UITypeEditor を持つプロパティ ExtendedValue があります。プロパティ ExtendedValue のエディターを開くと、デフォルト (初期) 値が「My Value」に設定されている必要があります。

これを行うのに最適な場所は、IWindowsFormsEditorService.DropDownControl または .ShowDialog を呼び出す直前の UITypeEditor.EditValue であると思われます。

唯一の問題は、問題のプロパティの値を読み取って UITypeEditor に設定するために、EditValue でエクステンダー プロバイダー自体を取得できない (または方法を発見していない) ことです。コンテキストによって拡張された制御が可能になりますが、この場合は役に立ちません。

私がしようとしていることを達成する方法はありますか? どんな助けでも大歓迎です!

ありがとうトム


@samjudson: それは悪い考えではありませんが、残念ながら、私はそこにたどり着きません. エクステンダー プロバイダーのインスタンスごとに、この既定値を個別に設定できるようにしたいと考えています。(拡張コントロールのグループごとに異なる値を持つ単一のフォームに複数ある場合があります。)

4

3 に答える 3

2

属性を自分で読み取れますか?

DefaultValueAttribute att = context.
    PropertyDescriptor.Attributes.
    OfType<DefaultValueAttribute>().
    FirstOrDefault();
object myDefault = null;
if ( att != null )
    myDefault = att.Value;

コードを簡素化するためにLinqを使用しましたが、.Net 1でも同様のことができます

于 2008-10-09T13:33:44.580 に答える
1

こんにちは、私はこれを見つけました: http://social.msdn.microsoft.com/forums/en-US/winformsdesigner/thread/07299eb0-3e21-42a3-b36b-12e37282af83/

基本的 :

var Ctl = context.Instance as Control;

Type t = Type.GetType("System.ComponentModel.ExtendedPropertyDescriptor");
LocalizationProvider myProvider = GetValueOnPrivateMember(t, context.PropertyDescriptor, "provider") as MyOwnExtenderProvider;

そして魔法のように、myProvider は私の IExtenderProvider コントロールを取得しました!

GetValueOnPrivateMember は次のように実装する必要があります。

static object GetValueOnPrivateMember(Type type, object dataobject, string fieldname)
        {
            BindingFlags getFieldBindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField;
            return type.InvokeMember(fieldname,
                getFieldBindingFlags,
                null,
                dataobject,
                null);
        }
于 2010-02-03T15:26:07.200 に答える
0

DefaultValueをExtenderProviderの静的プロパティとして追加することを検討しましたか?そうすれば、プロバイダーのインスタンスを必要とせずにそれにアクセスできますか?

于 2008-08-27T14:26:32.943 に答える