2011-11-07 8 views
1

PropertyGridを通じてobjectオブジェクトにアクセスし、それらが表す実際のものとして動作させたいと思います。おもちゃのクラスのような;.NET PropertyGrid:実行時にオブジェクトインスタンスにアクセスして操作する

[TypeConverter(typeof(ObjectBucket.ObjectBucketConverter))] 
class ObjectBucket 
{ 
    public object foo; 

    [Browsable(true)] 
    public object Object 
    { 
     get { return foo; } 
     set { foo = value; } 
    } 

    private class ObjectBucketConverter : ExpandableObjectConverter 
    { 
     public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
     { 
      return sourceType == typeof(string) ? true : base.CanConvertFrom(context, sourceType); 
     } 
    } 
} 
私はそれに何もしないことができるというの標準 object行動ではなく、オブジェクトのアクセサを通じて floatを言う設定し、それがPropertyGridの中 floatとして振る舞う持ってできるようにしたいと思い

回避策として、次のアクセサを配置しました。

[Browsable(true)] 
public string ObjectStr 
{ 
    get { return foo.ToString(); } 
    set 
    { 
     try 
     { 
      foo = TypeDescriptor.GetConverter(foo.GetType()).ConvertFromInvariantString(value); 
     } 
     catch 
     { 
      return; 
     } 
    } 
} 

私はオブジェクトを操作できますが、それは理想的ではありません。私もできることは可能ですか?

答えて

2

可能です。 ICustomTypeDescriptorを実装し、独自のインスタンスPropertyDescriptorsSystem.ComponentModel)を提供する必要があります。これらのプロパティ記述子では、ケースのフロートにプロパティタイプを指定できます。

1

ObjectBucket.Objectプロパティの独自のtypeEditorを実装することをお勧めします。 ユーザーが次のようにタイプして、このプロパティの値を指定することができ、エディタのフォームを表示されるようになります。ここでは
enter image description here

は実装スケルトンです:

class ObjectBucket { 
    object foo; 
    [Editor(typeof(ObjectUITypeEditor), typeof(UITypeEditor))] 
    public object Object { 
     get { return foo; } 
     set { foo = value; } 
    } 
} 
//... 
class ObjectUIEditor : Form { 
    public ObjectUIEditor(object editValue) { 
     /* TODO Initialize editor*/ 
    } 
    public object EditValue { 
     get { return null; /* TODO GetValue from editor */} 
    } 
} 
//... 
class ObjectUITypeEditor : System.Drawing.Design.UITypeEditor { 
    System.Windows.Forms.Design.IWindowsFormsEditorService edSvc = null; 
    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object objValue) 
     if(context != null && context.Instance != null && provider != null) { 
      edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 
      if(edSvc != null) { 
       try { 
        ObjectUIEditor editor = new ObjectUIEditor(objValue); 
        if(edSvc.ShowDialog(editor) == DialogResult.OK) 
         objValue = editor.EditValue; 
       } 
       catch { } 
      } 
     } 
     return objValue; 
    } 
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { 
     if(context != null && context.Instance != null) 
      return UITypeEditorEditStyle.Modal; 
     return base.GetEditStyle(context); 
    } 
} 
関連する問題