Пользовательский элемент управления Silverlight 3: только 'int' в качестве числового типа для свойства? [например. long или int64, кажется, ломается] - PullRequest
1 голос
/ 07 мая 2010

Я пытаюсь добавить новое свойство в мой пользовательский элемент управления Silverlight 3.Свойство int работает отлично, но если я изменю его на long или int64, у меня возникнет исключение парсера xaml во время выполнения.

Знаете ли вы, известно ли это ограничение в SL3?Сторона 1004 * 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 -->

1 Ответ

2 голосов
/ 11 мая 2010

Странно, на мой взгляд, Xaml не может анализировать все типы, которые реализуют IConvertible. (Хотелось бы узнать причину, если кто-нибудь из вас скрывается от магии, желает назидать?)

Вот реализация, которая может помочь: -

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.

...