2009-07-30 5 views
2

Voici mon type de données:Est-ce que Silverlight XAML prend en charge le type de données Byte?

using System; 

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

Voici ma collection:

using System.Collections.ObjectModel; 

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

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

Lorsque J'essaie d'attribuer une valeur en XAML à la propriété ID, J'obtiens une erreur AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 10 Position: 35]. Si je change le type de données de la propriété ID en int, tout va bien. Silverlight ne prend-il pas en charge le type de données byte?

+0

Selon vos expériences, je dirais que non. –

+0

C'est une question intéressante, mais je pense que c'est assez académique. Je voudrais juste utiliser un int (ou un convertisseur de valeur) si possible. J'ai supprimé ma réponse parce qu'elle ne répondait pas à la question que vous me posiez, donc pas de problème à aspirer les downvotes. –

Répondre

3

Spécification octet les valeurs utilisant la syntaxe d'attribut ne semblent pas fonctionner. Cependant, il est possible de spécifier des valeurs de type byte en utilisant la syntaxe de l'élément de propriété. Ajouter la la déclaration xmlns suivantes:

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

Le vous devriez être en mesure de préciser les propriétés d'octets comme ceci:

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

C'est un peu en désordre, donc ce que vous pouvez faire est de mettre en œuvre un Convertisseur de type personnalisé et marquez votre propriété avec un attribut pour utiliser ce convertisseur de type.

Le TypeConverter devrait ressembler à:

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

Et vous voulez ensuite modifier votre classe afin que les points de propriété à ce convertisseur de type:

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

Maintenant, vous devriez être en mesure d'utiliser la syntaxe de l'attribut de propriété régulière:

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

J'imagine que pour économiser de l'espace dans l'environnement d'exécution téléchargeable, l'analyseur XAML ne prend en charge que les entiers pour les nombres en XAML, d'où le comportement que vous voyez. Pour que l'analyseur syntaxique XAML sache comment analyser le code XAML, il doit d'abord comprendre le code qui prend l'entrée - il se peut qu'il ne prenne pas cela en compte et par conséquent analyse toujours quelque chose comme int.Parse.

Dans le cas où l'analyseur ne octets de support, mais pas de cette façon, vous pouvez le tester en spécifiant l'ID en utilisant la notation hexagonale ou définissant la propriété notation élément à l'aide plutôt que l'attribut comme dans:

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