2011-12-07 74 views

回答

7

您可以使用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; } 
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(多)ValueConverter。 –

+0

@Snowbear:这就是我现在所知道的,我将不胜感激任何更高级的解决方案,为什么你删除了你的答案并且没有提供答案?真的我没有其他想法如何做到这一点,所以将+1,如果你显示其他方式,在此先感谢 – sll

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

+1的左边填充增加。我刚刚意识到你在写我的之前,在sll的评论中提出了这个答案。 – Heinzi

+0

+1,很酷的东西! – sll

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等)中,因此您不会使用它控制属性。如果你是一个正在开发SomeControl,我会使用svick's approach并提供一个TypeConverter。

+0

当不是资源时,'x:Key'是多余的。 – svick

+0

@svick:谢谢,修正了这个问题。 – Heinzi

+0

+1,很酷的东西!从来不知道这样的语法 – sll