2011-04-23 72 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