【问题标题】:Does Silverlight XAML Support The Byte Data Type?Silverlight XAML 是否支持字节数据类型?
【发布时间】:2009-07-30 19:16:01
【问题描述】:

这是我的数据类型:

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>
    {
    }
}
这是我页面的 UserControl.Resources 部分中的 XAML:

    <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 [Line: 10 Position: 35] 错误。如果我将 ID 属性的数据类型更改为 int,则一切正常。 Silverlight 不支持字节数据类型吗?

【问题讨论】:

  • 根据你的实验,我会说不。
  • 这是一个有趣的问题,但我认为它很学术。如果可能的话,我只会使用 int (或值转换器)。我删除了我的答案,因为它没有回答你提出的问题,所以没有必要吸反对票。

标签: silverlight silverlight-3.0 silverlight-2.0


【解决方案1】:

使用属性语法指定字节值似乎不起作用。但是,可以使用属性元素语法指定字节值。 添加以下 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"/>

【讨论】:

    【解决方案2】:

    我想,为了节省可下载运行时的空间,XAML 解析器仅支持 XAML 中数字的整数,因此您所看到的行为。为了让 XAML 解析器知道如何解析 XAML,它需要先了解接受输入的代码——它可能实际上并没有考虑到这一点,因此总是使用 int.Parse 之类的东西进行解析。

    如果解析器确实支持字节但不支持这种方式,您可以通过使用十六进制表示法指定 ID 或使用元素表示法而不是属性设置属性来测试它,如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多