Пользовательский элемент управления Silverlight 3: только 'интервал' как числовой тип для свойства? [например, долго или int64, кажется, повреждается]

Я пытаюсь добавить новое свойство к моему пользовательскому элементу управления 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 -->
1
задан AnthonyWJones 11 May 2010 в 09:50
поделиться

1 ответ

На мой взгляд, странно, что 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 .

2
ответ дан 3 September 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: