字符串数组在XAML中以逗号分隔的字符串

时间:2011-12-07 10:36:04

标签: .net wpf xaml

如何在xaml中设置string []属性的值?

我控制下一个属性:string [] PropName

我想以下一种方式设置此属性的值:

<ns:SomeControl PropName="Val1,Val2" />

4 个答案:

答案 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。