我有一个属性网格输入的特殊情况,我需要在字符串格式下输入Vector3,让我们说“0,5,1”。我为它构建了转换器:
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]));
}
}
现在这种方式起作用了,但是出于另一个原因(我不打算解释,它是非常长的,但是有道理 - 我无法通过改变我的初始设计来避免它),我需要知道该领域的价值是什么在设置新的之前(以某种方式取决于它)。
我怎么能这样做?
答案 0 :(得分: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;
...
}
}