ソリューション1 - プロパティに
を追加あなたが取得するItem
クラスにプロパティを追加し、MyField.Value
を設定することができます。
public string Value
{
get
{
if (MyField != null)
return MyField.Value;
return null;
}
set
{
if (MyField != null)
MyField.Value = value;
}
}
好ましくは部分的にそのプロパティを定義しますクラス。
•クラスのコードにアクセスできる場合は、このオプションを使用します。それらのクラスがあなたのものでない場合は、3番目のソリューションを使用してください。
解決策2 - 利用ExpandableObjectConverterを
あなたはExpandableObjectConverter
でItem
クラスのMyField
プロパティを飾ることができます。また、あなたがしたい場合はプロパティグリッドでそれを隠すためにFieldType
クラスの[Browsable(false)]
とFieldType
を飾る:
[TypeConverter(typeof(ExpandableObjectConverter))]
public FieldType MyField { get; set; }
•MyField
の前に示されているテキストをカスタマイズするには、あなたがFieldType
のToString
メソッドをオーバーライドすることができます戻り値Value
を返します。また、カスタムTypeConverter
を使用して、ConvertTo
メソッドをオーバーライドすることもできます。
ソリューション3 - それは、第一の溶液のように簡単ではないですが、出力は完全にあなたが最初のソリューションを使用し得るもののようであるカスタムTypeDescriptor
を使用してください。これらのクラスを操作できない場合に適しています。
あなたはこのようにそれを使用することができます。
var item = new Item() { MyField = new FieldType() { Value = "Some Value" } };
TypeDescriptor.AddProvider(new MyTypeDescriptionProvider(), item);
this.propertyGrid1.SelectedObject = item;
かとItem
クラスを飾ることによって:
[TypeDescriptionProvider(typeof(MyTypeDescriptionProvider))]
public class Item
カスタムプロパティ記述
public class MyPropertyDescriptor : PropertyDescriptor
{
private PropertyDescriptor subProperty;
private PropertyDescriptor parentProperty;
public MyPropertyDescriptor(PropertyDescriptor parent, PropertyDescriptor sub)
: base(sub, null)
{
subProperty = sub;
parentProperty = parent;
}
public override bool IsReadOnly { get { return subProperty.IsReadOnly; } }
public override void ResetValue(object component)
{
subProperty.ResetValue(parentProperty.GetValue(component));
}
public override bool CanResetValue(object component)
{
return subProperty.CanResetValue(parentProperty.GetValue(component));
}
public override bool ShouldSerializeValue(object component)
{
return subProperty.ShouldSerializeValue(parentProperty.GetValue(component));
}
public override Type ComponentType { get { return parentProperty.ComponentType; } }
public override Type PropertyType { get { return subProperty.PropertyType; } }
public override object GetValue(object component)
{
return subProperty.GetValue(parentProperty.GetValue(component));
}
public override void SetValue(object component, object value)
{
subProperty.SetValue(parentProperty.GetValue(component), value);
OnValueChanged(component, EventArgs.Empty);
}
}
カスタムタイプ記述子
public class MyTypeDescriptor : CustomTypeDescriptor
{
ICustomTypeDescriptor original;
public MyTypeDescriptor(ICustomTypeDescriptor originalDescriptor)
: base(originalDescriptor)
{
original = originalDescriptor;
}
public override PropertyDescriptorCollection GetProperties()
{
return this.GetProperties(new Attribute[] { });
}
public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
var properties = original.GetProperties().Cast<PropertyDescriptor>().ToList();
var parent = properties.Where(x => x.Name == "MyField").First();
var sub = TypeDescriptor.GetProperties(typeof(FieldType))["Value"];
properties.Remove(parent);
properties.Add(new MyPropertyDescriptor(parent, sub));
return new PropertyDescriptorCollection(properties.ToArray());
}
}
カスタムTypeDescriptorProvider
public class MyTypeDescriptionProvider : TypeDescriptionProvider
{
public MyTypeDescriptionProvider()
: base(TypeDescriptor.GetProvider(typeof(object))) { }
public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType,
object instance)
{
ICustomTypeDescriptor baseDes = base.GetTypeDescriptor(objectType, instance);
return new MyTypeDescriptor(baseDes);
}
}
•Item
とFieldType
があなたでない場合は、このオプションを使用します。それらのクラスがあなたのものであり、コードを変更できる場合は、最初のソリューションを使用します。
ラッパーを作成すると、表示する内容と方法を制御できます。典型的なアプリケーションは、すべてのプロパティを翻訳し、いくつかを非表示にし、実行時の切り替えなどですが、非常に基本的な答えは '[Browsable(false)]属性を使うことです。 – Sinatr