Поддерживает ли Silverlight XAML байтовый тип данных? - PullRequest
2 голосов
/ 30 июля 2009

Вот мой тип данных:

using System;

namespace UI 
{
    public class AddressType
    {
        public byte ID { get; set; }
        public string Name { get; set; }
    } 
}

Вот моя коллекция:

using System.Collections.ObjectModel;

namespace UI
{
    public class AddressTypes : ObservableCollection<AddressType>
    {
    }
}
Here is my XAML from my UserControl.Resources section of my page:

    <local:AddressType ID="0" Name="Select"/>
    <local:AddressType ID="1" Name="Office"/>
    <local:AddressType ID="2" Name="Shipping"/>
    <local:AddressType ID="3" Name="Warehouse"/>
    <local:AddressType ID="4" Name="Home"/>
    <local:AddressType ID="5" Name="Foreign"/>

</local:AddressTypes>

Когда я пытаюсь присвоить значение в XAML свойству ID, я получаю ошибку AG_E_PARSER_BAD_PROPERTY_VALUE [Строка: 10 Позиция: 35]. Если я изменю тип данных свойства ID на int, все будет хорошо. Разве Silverlight не поддерживает тип данных байтов?

Ответы [ 2 ]

3 голосов
/ 14 августа 2009

Задание значений байтов с использованием синтаксиса атрибута не работает. Однако можно указать байтовые значения, используя синтаксис элемента свойства. Добавьте следующее объявление xmlns:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

Вы должны быть в состоянии указать свойства байта следующим образом:

<local:AddressType Name="Select">
  <local:AddressType.ID>
    <sys:Byte>0</sys:Byte>
  </local:AddressType.ID>
</local:AddressType>

Это немного грязно, поэтому вы можете реализовать собственный преобразователь типов и пометить свое свойство атрибутом для использования этого преобразователя типов.

TypeConverter должен выглядеть примерно так:

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

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value is string)
        {
            return Byte.Parse(value as string);
        }
        else
        {
            return base.ConvertFrom(context, culture, value);
        }
    }
}

И затем вы хотите изменить свой класс так, чтобы свойство указывало на этот преобразователь типов:

public class AddressType
{
    [TypeConverter(typeof(ByteTypeConverter))]
    public byte ID { get; set; }
    public string Name { get; set; }
}

Теперь вы сможете использовать обычный синтаксис атрибута свойства:

<local:AddressType ID="0" Name="Select"/>
0 голосов
/ 30 июля 2009

Я полагаю, что для экономии места в загружаемой среде выполнения синтаксический анализатор XAML поддерживает только целые числа для чисел в XAML, поэтому вы наблюдаете поведение. Чтобы синтаксический анализатор XAML знал, как анализировать XAML, ему необходимо сначала понять код, который принимает входные данные - возможно, он фактически не учитывает это и поэтому всегда анализирует с использованием чего-то вроде int.Parse.

В случае, если анализатор поддерживает байты, но не таким образом, вы можете проверить это, указав идентификатор с помощью шестнадцатеричной записи или установив свойство с помощью записи элемента вместо атрибута, как в:

<local:AddressType Name="Select">
  <ID>0x00</ID>
</local:AddressType>
...