.net 字符串数组作为XAML中逗号分隔的字符串

.net 字符串数组作为XAML中逗号分隔的字符串,.net,wpf,xaml,.net,Wpf,Xaml,如何在xaml中设置string[]属性的值 我有一个具有下一个属性的控件:string[]PropName 我想用下一种方法设置此属性的值: <ns:SomeControl PropName="Val1,Val2" /> 我们的想法是在控件/窗口的资源中将自定义值定义为数组,然后仅使用绑定到静态资源: <!-- or Window.Resources --> <UserControl.Resources> <x:Array x:Key="Cu

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

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

我想用下一种方法设置此属性的值:

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

我们的想法是在控件/窗口的资源中将自定义值定义为数组,然后仅使用绑定到静态资源:

<!-- 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
瓦尔2

瓦尔1
瓦尔2
您可以使用,但它的语法非常冗长

另一个选项是创建您自己的
TypeConverter
,它可以从逗号分隔的列表转换为数组:

class ArrayTypeConverter:TypeConverter
{
公共重写对象转换自(
ITypeDescriptor上下文、文化信息文化、对象值)
{
字符串列表=作为字符串的值;
如果(列表!=null)
返回列表。拆分(',');
返回base.ConvertFrom(上下文、区域性、值);
}
公共覆盖布尔CanConvertFrom(
ITypeDescriptorContext上下文,类型sourceType)
{
if(sourceType==typeof(string))
返回true;
返回base.CanConvertFrom(上下文,sourceType);
}
}
如果要转换的类型是您的类型,则可以应用于该类型。但是,由于您希望转换为
字符串[]
,因此无法执行此操作。因此,必须将该属性应用于要使用此转换器的所有属性:

[TypeConverter(typeof(ArrayTypeConverter))]
公共字符串[]PropName{get;set;}
很好,但是如果需要,可以避免使用资源,并将值直接写入控件:

<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> 

瓦尔1
瓦尔2
此外,您可以将
xmlns:
声明移动到head元素(Window、UserControl等)中,这样就不会使控件属性混乱


PS:如果你是开发
SomeControl
的人,我会使用并提供一个类型转换器。

为什么绑定到
StaticResource
?为什么要使用资源?+1,这是编译时已知值的方法。现在,如果他需要动态值(运行时值、绑定等),他将需要一个返回数组的I(多)值转换器。@Snowbear:这就是我现在知道的,我希望有更高级的解决方案,为什么你删除了答案而不提供答案?真的,我不知道怎么做,所以如果你用另一种方式,我会+1,谢谢你advance@sll,我删除了我的答案,因为它的格式很奇怪,因为一些未知的原因,试图弄清楚现在我知道编译时的所有值,因此不需要绑定任何动态值。
x:Key
在不是资源时是多余的。+1。我刚刚意识到,在我写我的答案之前,你是以sll的评论方式提出这个答案的。