我该如何在XAML中设置string[]属性的值?
我有一个具有以下属性的控件:string[] PropName
我想以以下方式设置此属性的值:
<ns:SomeControl PropName="Val1,Val2" />
<x:Array>
标记扩展,但它的语法相当冗长。TypeConverter
,它可以将逗号分隔的列表转换为数组:class ArrayTypeConverter : TypeConverter
{
public override object ConvertFrom(
ITypeDescriptorContext context, CultureInfo culture, object value)
{
string list = value as string;
if (list != null)
return list.Split(',');
return base.ConvertFrom(context, culture, value);
}
public override bool CanConvertFrom(
ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
}
如果您要转换的类型是您的类型,则可以将[TypeConverter]
属性应用于该类型。但是,由于您想要转换为string[]
,因此您无法这样做。因此,您必须将该属性应用于所有希望使用此转换器的属性:
[TypeConverter(typeof(ArrayTypeConverter))]
public string[] PropName { get; set; }
<ns:SomeControl>
<SomeControl.PropName>
<x:Array Type="sys:String">
<sys:String>Val1</sys:String>
<sys:String>Val2</sys:String>
</x:Array>
</SomeControl.PropName>
</ns:SomeControl>
这个想法是在控件/窗口的资源中定义自定义值为数组,然后只需将绑定用于静态资源:
<!-- or Window.Resources -->
<UserControl.Resources>
<x:Array x:Key="CustomValues"
Type="sys:String"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String>Val1</sys:String>
<sys:String>Val2</sys:String>
</x:Array>
</UserControl.Resources>
<!-- Then just bind -->
<ns:SomeControl PropName="{Binding Source={StaticResource CustomValues}}" />
<ns:SomeControl><ns:SomeControl.PropName><x:Array>…</x:Array></ns:SomeControl.PropName></ns:SomeControl>
这样的东西。 - svick<ns:SomeControl>
<ns:SomeControl.PropName>
<x:Array Type="sys:String"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String>Val1</sys:String>
<sys:String>Val2</sys:String>
</x:Array>
</ns:SomeControl.PropName>
</ns:SomeControl>
xmlns:
声明移动到头元素(Window、UserControl等)中,以免在控件属性中混杂它们。SomeControl
的人,我建议使用svick的方法并提供TypeConverter。x:Key
不是资源时,它是多余的。 - svick