Silverlight XAMLはByteデータ型をサポートしていますか?
-
05-07-2019 - |
質問
ここに私のデータ型があります:
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:
<!> lt; local:AddressTypes x:Name = <!> quot; AddressTypesList <!> quot; <!> gt;
<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はバイトデータ型をサポートしていませんか?
解決
属性構文を使用してバイト値を指定しても機能しないようです。ただし、プロパティ要素の構文を使用してバイト値を指定することは可能です。 次の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"/>
他のヒント
ダウンロード可能なランタイムのスペースを節約するために、XAMLパーサーはXAMLの数値の整数のみをサポートするため、表示される動作を想像します。 XAMLパーサーがXAMLを解析する方法を知るためには、最初に入力を受け取るコードを理解する必要があります-実際にはこれを考慮していないため、常にint.Parse
のようなものを使用して解析する可能性があります。
パーサーがバイトをサポートしているがこの方法ではない場合、16進表記を使用してIDを指定するか、次のように属性ではなく要素表記を使用してプロパティを設定することでテストできます:
<local:AddressType Name="Select">
<ID>0x00</ID>
</local:AddressType>