我有一個ObservableCollection作爲自定義控件中的依賴項屬性(比如說Points)。WPF TypeConversionAttribute收集DP
我想初始化像這樣
<MyControl Points="1,1, 2,2"/>
我如何去定義和創建針對特定DP一個類型轉換器?
我知道有一個專門的點集合類與內置的typeconverter但我不能使用它。
我有一個ObservableCollection作爲自定義控件中的依賴項屬性(比如說Points)。WPF TypeConversionAttribute收集DP
我想初始化像這樣
<MyControl Points="1,1, 2,2"/>
我如何去定義和創建針對特定DP一個類型轉換器?
我知道有一個專門的點集合類與內置的typeconverter但我不能使用它。
您可以在您的依賴項屬性的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;
}
}
很好的問題。有一種方法可以做到這一點 - 將您的點的DP更改爲對象/字符串類型(以避免無效的轉換異常)並在DP更改事件處理程序中進行轉換。最後你幾乎不會失去 - DP系統不完全是一個類型安全的框架。
這將工作。我可以將JSON看作是序列化數據的格式。
另一種方法是在可觀察集合上引入更高級別的抽象。通常這會緩解XAML的壓力。
[的TypeConverter(typeof運算(*))]是通過各種手段雨衣。 – 2011-03-01 13:00:11
非常感謝。但它似乎不適用於VS設計師。有什麼想法嗎? – NVM 2011-03-01 13:00:45
@NVM - 不,對不起。不知道VS設計師是如何工作的。但是您可能想要使用Reflector來查看這是如何實現的,例如,Path對象的Data屬性。 – 2011-03-01 13:44:15
謝謝,我會檢查。 – NVM 2011-03-01 13:47:28