【发布时间】:2011-12-07 10:36:04
【问题描述】:
如何在 xaml 中设置 string[] 属性的值?
我控制下一个属性:string[] PropName
我想用下一种方式设置这个属性的值:
<ns:SomeControl PropName="Val1,Val2" />
【问题讨论】:
如何在 xaml 中设置 string[] 属性的值?
我控制下一个属性:string[] PropName
我想用下一种方式设置这个属性的值:
<ns:SomeControl PropName="Val1,Val2" />
【问题讨论】:
你可以使用the <x:Array> markup extension,但它的语法相当冗长。
另一种选择是创建您自己的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);
}
}
如果您要转换的类型是您的类型,那么您可以将the [TypeConverter] attribute 应用于该类型。但既然你想转换成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}}" />
【讨论】:
StaticResource?为什么要资源?
sll's answer 很好,但是如果你愿意,你可以避免使用资源并将值直接写入控件:
<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 等)中,这样您的控件属性就不会被它弄乱。
PS:如果你是开发 SomeControl 的人,我会使用 svick's approach 并提供一个 TypeConverter。
【讨论】:
x:Key 在不是资源时是多余的。