我有一个特殊情况下的属性网格输入,我需要以字符串格式(例如“ 0、5、1”)输入Vector3。我为此构建了转换器:
public class Vector3Converter : ExpandableObjectConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return (sourceType == typeof(string));
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
string[] splitted = ((string)value).Remove(" ").Split(new char[] { ',' });
return new Vector3(float.Parse(splitted[0]), float.Parse(splitted[1]), float.Parse(splitted[2]));
}
}
现在这可以以某种方式起作用,但是由于另一个原因(我不会费心解释,它的时间长得令人难以置信,但是有道理-我无法通过更改初始设计来避免它),我需要先确定该字段的值,然后再设置新的(某种程度上取决于它)。
我该怎么办?
最佳答案
好吧,您应该修复您的设计,而不必这样做。请记住,类型转换器不是专用于属性网格的,并且当没有“旧值”可言时,很有可能需要进行转换。
这有点骇人听闻,但是您可以将context
强制转换为System.Windows.Forms.GridItem
(表示属性网格上的一行),然后检查其Value
属性。
显然,在非属性网格上下文中调用ConvertFrom
方法时,这将行不通。
public override object ConvertFrom
(ITypeDescriptorContext context, CultureInfo culture, object value)
{
var gridItem = context as GridItem;
// If the context is indeed a property-grid item...
if (gridItem != null)
{
var oldVector = (Vector3)gridItem.Value;
...
}
}