我有一个特殊情况下的属性网格输入,我需要以字符串格式(例如“ 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;
        ...
    }

}

10-08 03:58