代码之家  ›  专栏  ›  技术社区  ›  CannibalSmith

如何为我不拥有的类型和属性实现TypeConverter?

  •  4
  • CannibalSmith  · 技术社区  · 15 年前

    <GeometryDrawing>
        <GeometryDrawing.Pen>
            <Pen Brush="Black"/>
        </GeometryDrawing.Pen>
    </GeometryDrawing>
    

    我想要这个:

    <GeometryDrawing Pen="Black"/>
    

    TypeConverter :

    public class PenConverter : TypeConverter
    {
        static readonly BrushConverter brushConverter = new BrushConverter();
    
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string)) return true;
            return base.CanConvertFrom(context, sourceType);
        }
    
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            var s = value as string;
            if (a != null)
            {
                var brush = brushConverter.ConvertFromInvariantString(s) as Brush;
                return new Pen(brush, 1);
            }
            return base.ConvertFrom(context, culture, value);
        }
    }
    

    现在,我怎么把它和 Pen 类型?我不能加一个 TypeConverterAttribute 因为我不拥有它(我也不拥有它) GeometryDrawing.Pen 属性)。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Benjamin Podszun    15 年前

    This link here

    public static void Register<T, TC>() where TC: TypeConverter
    {
     Attribute[] attr = new Attribute[1];
     TypeConverterAttribute vConv = new TypeConverterAttribute(typeof(TC));
          attr[0] = vConv;
     TypeDescriptor.AddAttributes(typeof(T), attr);
    }
    

        2
  •  1
  •   brunnerh    13 年前

    Benjamin Podszun的答案在这里不起作用,因为XAML解析器似乎忽略了通过 TypeDescriptor

    <GeometryDrawing Pen="{Binding Source=Black}"/>
    

    我承认不太优雅,类似地你可以用 markup extension 作为一个笔厂。。。