2011-12-07 12 views

Respuesta

7

puede usar the <x:Array> markup extension, pero su sintaxis es bastante detallada.

Otra opción es crear su propia TypeConverter que puede convertir de la lista separada por comas de una matriz:

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); 
    } 
} 

Si el tipo que estaba convirtiendo a era su tipo, que podría luego aplicar the [TypeConverter] attribute a ese tipo. Pero como quiere convertir a string[], no puede hacer eso. Así que hay que aplicar ese atributo a todas las propiedades en las que desee utilizar este convertidor:

[TypeConverter(typeof(ArrayTypeConverter))] 
public string[] PropName { get; set; } 
2

La idea es definir valores personalizados como matriz en los recursos de un control/ventana y luego simplemente utilizar el enlace a un recurso estático:

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

¿Por qué enlazar a 'StaticResource'? ¿Por qué recurso en absoluto? – Snowbear

+2

+1, este es el camino a seguir para los valores conocidos en tiempo de compilación. Ahora, si necesita valores dinámicos (valores de tiempo de ejecución, límite, etc.) va a necesitar un I (Multi) ValueConverter que devuelva una matriz. –

+0

@Snowbear: esto es lo que sé por el momento, agradecería cualquier solución más avanzada, ¿por qué eliminó su respuesta y no proporcionó una respuesta? Realmente no tengo otra idea de cómo hacerlo, así que haría +1 si se muestra de otra manera, gracias de antemano – 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.Me acabo de dar cuenta de que propusiste esta respuesta en los comentarios de sll mucho antes de escribir la mía. – Heinzi

+0

+1, cosas geniales! – sll

2

sll's answer es grande, pero se puede evitar el recurso si quieres y escribir el valor directamente en el control:

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

Además, puede mover las declaraciones xmlns: al elemento de encabezado (Ventana, Control de usuario, etc.), para no saturar sus propiedades de control con él.

PD: Si usted es el que está desarrollando SomeControl, usaría svick's approach y proporcionaría un TypeConverter.

+0

La 'x: Key' es redundante cuando no es un recurso. – svick

+0

@svick: Gracias, corrigió eso. – Heinzi

+0

+1, cosas geniales! Nunca se sabe sobre tal sintaxis – sll

Cuestiones relacionadas