C# .NET PropertyGrid:使用ExpandableObjectConverter更改复杂对象的读/写权限
我正在尝试编辑PropertyGrid控件中的复杂对象。我添加了ExpandableObjectConverter(或者在需要时添加我自己的子类)作为TypeConverter,它工作得很好 有一件事我似乎弄不明白。在网格中,对象本身旁边将有其.ToString()表示形式。然后,当我展开对象时,属性具有相同的属性。所有都可以编辑。我想禁用ToString()对象字段的编辑,但保持属性可编辑 所以在PropertyGrid中,它看起来是这样的C# .NET PropertyGrid:使用ExpandableObjectConverter更改复杂对象的读/写权限,c#,.net,winforms,propertygrid,C#,.net,Winforms,Propertygrid,我正在尝试编辑PropertyGrid控件中的复杂对象。我添加了ExpandableObjectConverter(或者在需要时添加我自己的子类)作为TypeConverter,它工作得很好 有一件事我似乎弄不明白。在网格中,对象本身旁边将有其.ToString()表示形式。然后,当我展开对象时,属性具有相同的属性。所有都可以编辑。我想禁用ToString()对象字段的编辑,但保持属性可编辑 所以在PropertyGrid中,它看起来是这样的 + Color {(R,G,B,A) =
+ Color {(R,G,B,A) = (255,255,255,255)} --uneditable
Alpha 255 --editable
Blue 255 --editable
Green 255 --editable
Red 255 --editable
到目前为止,我还没有找到这样做的方法。如果我尝试使其为只读,则整个对象将变为只读。如果我指定自己的ExpandableObjectConverter并声明它无法从字符串转换,如果在PropertyGrid中编辑该字符串,它仍将尝试强制转换,然后失败
我本质上只是想要它,这样我就可以阻止最终用户编辑字符串,并强制他们编辑单个属性,这样我就不必为每个类编写字符串解析器
这是可能的,还是有另一种我没有想到的方法呢?这似乎很管用:
[TypeConverter(typeof (Color.ColorConverter))]
public struct Color
{
private readonly byte alpha, red, green, blue;
public Color(byte alpha, byte red, byte green, byte blue)
{
this.alpha = alpha;
this.red = red;
this.green = green;
this.blue = blue;
}
public byte Alpha { get { return alpha; } }
public byte Red { get { return red; } }
public byte Green { get { return green; } }
public byte Blue { get { return blue; } }
public override string ToString()
{
return string.Format("{{(R,G,B,A) = ({0},{1},{2},{3})}}", Red, Green, Blue, Alpha);
}
private class ColorConverter : ExpandableObjectConverter
{
public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
{
return true;
}
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
{
return new Color((byte)propertyValues["Alpha"], (byte)propertyValues["Red"],
(byte) propertyValues["Green"], (byte) propertyValues["Blue"]);
}
}
}
颜色是我自己的名为“Color4”的类,不是.NET类,对不起。它是
类
还是结构
?(我在考虑不同的选择)k;我有一些对课堂有用的东西;我将尝试让它为struct工作……原因有二:首先,大多数struct应该是不可变的(意思是:没有setter)——这需要CreateInstance
模式;其次,对于结构,网格最终编辑了值的一个断开连接的盒装副本,否则,这意味着您可以进行从未应用于实际实例的更改(您可以通过向结构添加setter并删除create instance内容来看到这一点),但基本相同,但没有CreateInstance内容。同样重要的是,CanConvertFrom
报告字符串的false
(以避免使文本版本可编辑),但IIRC是默认值。特别是,当它是一个类时,我让成员是可变的