Pregunta El punto de la clase ValueConversionAttribute?


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

[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 cast a string y no se lanza ninguna advertencia a pesar de estar en conflicto con este atributo.


32
2018-03-09 04:16


origen


Respuestas:


Usted puede usar potencialmente el ValueConversionAttribute para determinar qué tipos están involucrados en los convertidores y utilizar esa información de manera útil. Mirar Convertidores de valores de tubería en 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>

25
2017-11-05 17:14



Es solo una anotación.

MSDN:

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

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


12
2018-03-09 04:32