2012-03-09 9 views
30

¿Cuál es el objetivo de este atributo? Después de agregarlo, todavía necesito hacer un molde en el objeto de valor.El punto de la clase ValueConversionAttribute?

[ValueConversion(sourceType: typeof(double), targetType: typeof(string))] 
public class SpeedConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var speed = (double)value; 

¿Es solo para la legibilidad del código? Porque cuando cambio la ruta de un enlace a un String en xaml, Visual Studio no emite una advertencia sobre el tipo incorrecto y solo se lanza una excepción cuando se lanza, por lo que no significa nada incluso cuando se detecta un error al compilar. También puedo cambiar un lanzamiento a una cadena y no se lanza ninguna advertencia a pesar de estar en conflicto con este Atributo.

Respuesta

23

Puede potencial Utilice el ValueConversionAttribute para determinar qué tipos están involucrados en los convertidores y utilizar esa información de manera útil. Mire Piping Value Converters in WPF como un excelente ejemplo para el uso de ValueConversionAttribute.

El ejemplo muestra cómo se pueden encadenar las clases de convertidor múltiple, y ValueConversion se puede usar para pasar información de tipo al siguiente convertidor en línea.

[ValueConversion(typeof(string), typeof(ProcessingState))] 
public class IntegerStringToProcessingStateConverter : IValueConverter 
{ 
object IValueConverter.Convert( 
    object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    int state; 
    bool numeric = Int32.TryParse(value as string, out state); 
    Debug.Assert(numeric, "value should be a String which contains a number"); 
    Debug.Assert(targetType.IsAssignableFrom(typeof(ProcessingState)), 
    "targetType should be ProcessingState"); 

    switch(state) 
    { 
    case -1: 
    return ProcessingState.Complete; 
    case 0: 
    return ProcessingState.Pending; 
    case +1: 
    return ProcessingState.Active; 
    } 
    return ProcessingState.Unknown; 
} 

object IValueConverter.ConvertBack( 
    object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    throw new NotSupportedException("ConvertBack not supported."); 
} 
} 
// ************************************************************* 
[ValueConversion(typeof(ProcessingState), typeof(Color))] 
public class ProcessingStateToColorConverter : IValueConverter 
{ 
object IValueConverter.Convert( 
    object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    Debug.Assert(value is ProcessingState, "value should be a ProcessingState"); 
    Debug.Assert(targetType == typeof(Color), "targetType should be Color"); 

    switch((ProcessingState)value) 
    { 
    case ProcessingState.Pending: 
    return Colors.Red; 
    case ProcessingState.Complete: 
    return Colors.Gold; 
    case ProcessingState.Active: 
    return Colors.Green; 
    } 
    return Colors.Transparent; 
} 

object IValueConverter.ConvertBack( 
    object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    throw new NotSupportedException("ConvertBack not supported."); 
} 
} 

object IValueConverter.Convert( 
    object value, Type targetType, object parameter, CultureInfo culture) 
{ 
object output = value; 
for(int i = 0; i < this.Converters.Count; ++i) 
{ 
    IValueConverter converter = this.Converters[i]; 
    Type currentTargetType = this.GetTargetType(i, targetType, true); 
    output = converter.Convert(output, currentTargetType, parameter, culture); 

    // If the converter returns 'DoNothing' 
    // then the binding operation should terminate. 
    if(output == Binding.DoNothing) 
    break; 
} 
return output; 
} 
//***********Usage in XAML************* 
    <!-- Converts the Status attribute text to a Color --> 
    <local:ValueConverterGroup x:Key="statusForegroundGroup"> 
      <local:IntegerStringToProcessingStateConverter /> 
      <local:ProcessingStateToColorConverter /> 
    </local:ValueConverterGroup> 
+2

en mi humilde opinión, esta debería ser la respuesta porque muestra la necesidad/uso programático del atributo. Gran hallazgo – MarqueIV

12

Es solo una anotación.

MSDN:

Al implementar la interfaz IValueConverter, es una buena práctica para decorar la aplicación con un ValueConversionAttribute atributo para indicar a herramientas de desarrollo de los tipos de datos que intervienen en la conversión

No sé lo que las "herramientas de desarrollo" harían con esa información ...

+0

Es más fácil escribir dicha información en los comentarios. Tal vez se utiliza para la autogeneración de documentación? – Lars

+0

@Lars: Quién sabe, todavía no lo he visto útil en ningún lado ... –

+8

Uh-huh ... Bueno, al menos tengo un propósito en mi vida: escribir un complemento de Visual Studio para usar este atributo. – Lars

Cuestiones relacionadas