在XAML中将字符串数组转换为逗号分隔的字符串

8

我该如何在XAML中设置string[]属性的值?

我有一个具有以下属性的控件:string[] PropName

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

<ns:SomeControl PropName="Val1,Val2" />
4个回答

11
你可以使用<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; }

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>

+1。我刚意识到你在sll的评论中提出了这个答案,早在我写我的之前。 - Heinzi

2

这个想法是在控件/窗口的资源中定义自定义值为数组,然后只需将绑定用于静态资源:

<!-- 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}}" />

1
为什么要绑定到“StaticResource”?为什么需要资源? - Snowbear
2
+1,这是在编译时已知值的最佳选择。现在,如果他需要动态值(运行时值、绑定等),他将需要一个返回数组的I(Multi)ValueConverter。 - Louis Kottmann
@Snowbear:这是我现在所知道的,如果您有更高级的解决方案,我会非常感激。为什么您删除了您的答案并没有提供答案呢?实际上,我没有其他想法如何做到这一点,如果您能展示另一种方法,我会点赞的。提前感谢您。 - sll
@sll,我认为他的意思是类似于 <ns:SomeControl><ns:SomeControl.PropName><x:Array>…</x:Array></ns:SomeControl.PropName></ns:SomeControl> 这样的东西。 - svick
@Snowbear:看起来你的回答格式有些问题,导致格式行为异常,现在看起来好多了,但我不知道问题出在哪里。 - sll
显示剩余7条评论

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:声明移动到头元素(Window、UserControl等)中,以免在控件属性中混杂它们。
PS:如果您是正在开发SomeControl的人,我建议使用svick的方法并提供TypeConverter。

x:Key 不是资源时,它是多余的。 - svick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接