2011-12-07 80 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