Я пытаюсь добавить новое свойство к моему пользовательскому элементу управления Silverlight 3. Международное свойство работает отлично, но если я изменяю его на длинное или int64, у меня есть xaml исключение синтаксического анализатора на времени выполнения.
Вы знаете, является ли это известное ограничение в SL3?
Сторона C#, новое управление:
public class myExtTextBox : TextBox
{
public int MaxNumericValue { get; set; }
//public long MaxLongNumericValue { get; set; } => This breaks the parser
}
Сторона XAML:
<myExtTextBox x:Name="foobar" MaxNumericValue="12" /> <!-- OK -->
<myExtTextBox x:Name="foobar" MaxLongNumericValue="12" /> <!-- Breaks parser -->
На мой взгляд, странно, что Xaml не может анализировать все типы, реализующие IConvertible
. (Я хотел бы знать причину, если кто-то из вас, скрывающихся от MS, хочет поучить?)
Вот реализация, которая может помочь: -
public class ConvertibleTypeConverter<T> : TypeConverter where T: IConvertible
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType.GetInterface("IConvertible", false) != null;
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
return destinationType.GetInterface("IConvertible", false) != null;
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
return ((IConvertible)value).ToType(typeof(T), culture);
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
return ((IConvertible)value).ToType(destinationType, culture);
}
}
Теперь в свойстве MaxLongNumericValue
вы используете атрибут вот так: -
[TypeConverter(typeof(ConvertibleTypeConverter<long>))]
public long MaxLongNumericValue { get; set; }
Теперь, когда синтаксический анализатор Xaml добирается до этого свойства, он обращается к указанному TypeConverter
.