【问题标题】:How to get old value in PropertyGrid TypeConversion?如何在 PropertyGrid TypeConversion 中获取旧值?
【发布时间】:2011-04-23 23:09:54
【问题描述】:

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

现在这以某种方式起作用,但出于另一个原因(我不会费心解释,它非常长,但有道理 - 我无法通过更改我的初始设计来避免它),我需要知道该领域的价值是什么在设置新的之前(这在某种程度上取决于它)。

我该怎么做?

【问题讨论】:

    标签: c# .net winforms propertygrid typeconverter


    【解决方案1】:

    嗯,你应该修正你的设计,这样你就不必这样做了。请记住,类型转换器并非仅由属性网格使用,当没有“旧值”可言时,很有可能需要进行转换。

    这有点小技巧,但您可以将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;
            ...
        }
    
    }
    

    【讨论】:

    • 很遗憾,我无法更改设计,许多限制使它变得不可能(我已经尝试了几个月)。但是这个 hack 非常有效。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多