2011-04-23 74 views
2

我有一个属性网格输入的特殊情况,我需要在字符串格式下输入Vector3,比如说“0,5,1”。我内置的转换器,它是这样:如何在PropertyGrid TypeConversion中获取旧值?

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])); 
    } 
} 

现在这个工作在某种程度上,但另一个原因(我不会打扰解释,这是令人难以置信的长,但合理的 - 我不能改变我的初步避免设计),我需要知道在设定新的设计之前(在某种程度上取决于它)之前,现场有什么价值。

我该怎么做?

回答

2

那么,你应该修复你的设计,所以你不必这样做。请记住,类型转换器并非仅由属性网格使用,并且在没有“旧价值”的情况下可能需要进行转换。

这是一个黑客,但你可以投contextSystem.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; 
     ... 
    } 

} 
+0

我不幸地不能改变设计,很多约束只是使它不可能(我已经试了几个月)。但是这个黑客完美地工作。谢谢一堆! – Lazlo 2011-04-24 22:21:58