silverlight silverlight-3.0 silverlight-2.0

¿Silverlight XAML admite el tipo de datos Byte?



silverlight-3.0 silverlight-2.0 (2)

Aquí está mi tipo de datos:

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

Aquí está mi colección:

using System.Collections.ObjectModel; namespace UI { public class AddressTypes : ObservableCollection<AddressType> { } }

Here is my XAML from my UserControl.Resources section of my page:

<local: AddressTypes x: Name = "AddressTypesList">

<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>

Cuando intento asignar un valor en XAML a la propiedad ID, aparece un error AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 10 Position: 35]. Si cambio el tipo de datos de la propiedad ID a int, todo está bien. ¿Silverlight no es compatible con el tipo de datos byte?


Me imagino que para ahorrar espacio en el tiempo de ejecución descargable, el analizador XAML solo admite enteros para números en XAML, de ahí el comportamiento que está viendo. Para que el analizador XAML sepa cómo analizar el XAML necesitaría entender primero el código que toma la entrada; puede ser que en realidad no tenga esto en cuenta y, por lo tanto, siempre analiza usando algo como int.Parse .

En caso de que el analizador soporte bytes pero no de esta manera, puede probarlo especificando el ID usando notación hexadecimal o estableciendo la propiedad usando notación de elemento en lugar de atributo como en:

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


Especificar valores de bytes utilizando la sintaxis de atributos no parece funcionar. Sin embargo, es posible especificar valores de bytes utilizando la sintaxis del elemento de propiedad. Agregue la siguiente declaración xmlns:

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

Debería poder especificar las propiedades de bytes de esta manera:

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

Sin embargo, esto es bastante desordenado, así que lo que puedes hacer es implementar un convertidor de tipo personalizado y marcar tu propiedad con un atributo para usar ese tipo de convertidor.

TypeConverter debería verse más o menos así:

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); } } }

Y luego desea modificar su clase para que la propiedad apunte a este tipo de convertidor:

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

Ahora debería poder usar la sintaxis del atributo de propiedad regular:

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