2011-03-01 55 views
2

我有一個ObservableCollection作爲自定義控件中的依賴項屬性(比如說Points)。WPF TypeConversionAttribute收集DP

我想初始化像這樣

<MyControl Points="1,1, 2,2"/> 

我如何去定義和創建針對特定DP一個類型轉換器?

我知道有一個專門的點集合類與內置的typeconverter但我不能使用它。

回答

3

您可以在您的依賴項屬性的CLR屬性包裝器上指定TypeConverter。就像這樣:

public class MyControl : Control 
{ 
    [TypeConverter(typeof(MyStringToPointCollectionConverter))] 
    public ObservableCollection<Point> Points { 
     get { return (ObservableCollection<Point>)GetValue(Points yProperty); } 
     set { SetValue(Points Property, value); } 
    } 
    ... 
} 

和轉換器會是這個樣子:

public class MyStringToPointCollectionConverter : TypeConverter { 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { 
     if (sourceType == typeof(string)) { 
      return true; 
     } 

     return false; 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { 
     var stringValue = value as string; 

     if (stringValue != null) { 
      var result = new ObservableCollection<Point>(); 

      // Here goes the logic of converting the given string to the list of points 

      return result; 
     } 

     return null; 
    } 
} 
+1

非常感謝。但它似乎不適用於VS設計師。有什麼想法嗎? – NVM 2011-03-01 13:00:45

+0

@NVM - 不,對不起。不知道VS設計師是如何工作的。但是您可能想要使用Reflector來查看這是如何實現的,例如,Path對象的Data屬性。 – 2011-03-01 13:44:15

+0

謝謝,我會檢查。 – NVM 2011-03-01 13:47:28

0

很好的問題。有一種方法可以做到這一點 - 將您的點的DP更改爲對象/字符串類型(以避免無效的轉換異常)並在DP更改事件處理程序中進行轉換。最後你幾乎不會失去 - DP系統不完全是一個類型安全的框架。

這將工作。我可以將JSON看作是序列化數據的格式。

另一種方法是在可觀察集合上引入更高級別的抽象。通常這會緩解XAML的壓力。

+0

[的TypeConverter(typeof運算(*))]是通過各種手段雨衣。 – 2011-03-01 13:00:11