2012-03-09 5 views
30

Qual è il punto di questo attributo? Dopo averlo aggiunto, ho ancora bisogno di creare un cast su oggetti valore.Il punto della classe 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; 

È solo per la leggibilità del codice? Perché quando cambio il percorso di un bind in una stringa in xaml, Visual Studio non fornisce un avvertimento sul tipo errato e l'eccezione viene lanciata solo al momento del cast, quindi non significa nulla nemmeno nei primi errori durante la compilazione. Posso anche cambiare un cast in stringa e nessun avviso viene lanciato nonostante sia in conflitto con questo Attributo.

risposta

23

È possibile il potenziale utilizzare lo ValueConversionAttribute per determinare quali tipi sono coinvolti nei convertitori e utilizzare tali informazioni in modo utile. Vedere Piping Value Converters in WPF come esempio eccellente per l'uso di ValueConversionAttribute.

L'esempio mostra come è possibile concatenare più classi di convertitori e ValueConversion può essere utilizzato per passare informazioni di tipo al successivo convertitore in linea.

[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

IMHO, questa dovrebbe essere la risposta perché mostra la necessità/l'utilizzo programmatico dell'attributo. Grande scoperta – MarqueIV

12

È solo un'annotazione.

MSDN:

Nell'attuare l'interfaccia IValueConverter, è una buona pratica per decorare la realizzazione con un ValueConversionAttribute attributo indicare agli strumenti di sviluppo i tipi di dati coinvolti nella conversione

Non so cosa gli "strumenti di sviluppo" farebbero con quelle informazioni ...

+0

È più semplice scrivere tali informazioni nei commenti. Forse è usato per la documentazione di generazione automatica? – Lars

+0

@Lars: Chissà, non ho visto essere utile da nessuna parte ancora ... –

+8

Uh-huh ... Beh, almeno ho uno scopo nella mia vita - scrivere un componente aggiuntivo di Visual Studio per utilizzare questo attributo. – Lars