Как получить старое значение в PropertyGrid TypeConversion? - PullRequest
2 голосов
/ 24 апреля 2011

У меня есть особый случай ввода сетки свойств, где мне нужно было бы ввести 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]));
    }
}

Теперь это работает как-то, но по другой причине (не буду объяснять, это невероятно долго, но оправдано - я не мог избежать этого, изменивмой первоначальный дизайн), мне нужно знать, какое значение было в поле, прежде чем устанавливать новое (что как-то зависит от него).

Как я могу это сделать?

1 Ответ

2 голосов
/ 24 апреля 2011

Ну, вы должны исправить свой дизайн, чтобы вам не пришлось это делать. Помните, что преобразователи типов не используются исключительно сетками свойств, и есть большая вероятность, что преобразование может потребоваться, когда нет «старого значения», о котором можно было бы говорить.

Это немного взломано, но вы можете привести 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;
        ...
    }

}
...