如何在xaml中设置string []属性的值?
我控制下一个属性:string [] PropName
我想以下一种方式设置此属性的值:
<ns:SomeControl PropName="Val1,Val2" />
答案 0 :(得分:8)
您可以使用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; }
答案 1 :(得分:3)
<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>
答案 2 :(得分:2)
我们的想法是在控件/窗口的资源中将自定义值定义为Array,然后只使用Binding到静态资源:
<!-- 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}}" />
答案 3 :(得分:2)
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:
声明移动到head元素(Window,UserControl等),这样就不会使控件属性混乱。
PS:如果您是开发SomeControl
的人,我会使用svick's approach并提供TypeConverter。