2010-01-04 44 views
3

這是煩人:如何爲類型和屬性實現TypeConverter我不擁有?

<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屬性)。

+0

參見http://stackoverflow.com/q/849202/284795 – 2012-11-26 13:57:39

回答

2

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

該方法的最後一部分,似乎這樣的伎倆。

+0

這似乎並不奏效。我在InitializeComponent之前調用AddAttributes,它仍然會拋出。 :( – CannibalSmith 2010-01-04 14:47:24

+0

您是否通過訪問TypeDescriptor.GetConverter(typeof(Pen))來檢查Typeconverter是否工作? – 2010-01-04 15:17:15

+0

GetConverter返回我的PenConverter好吧。 – CannibalSmith 2010-01-05 08:26:05

0

本傑明Podszun答案,因爲XAML分析器似乎忽略通過TypeDescriptor添加的屬性並不在這裏工作,綁定但不這樣做,那麼你可以使用一個解決此問題:

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

不是很優雅我承認,類似地,你可以使用markup extension作爲一個鋼筆廠...

相關問題