2012-03-09 12 views
30

Jaki jest sens tego atrybutu? Po dodaniu go nadal muszę wykonać rzut na obiekt wartości.Punkt klasy 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; 

Czy tylko do odczytu kodu? Ponieważ po zmianie ścieżki wiązania na ciąg w języku xaml, program Visual Studio nie generuje ostrzeżenia o niepoprawnym typie, a wyjątek jest zgłaszany tylko podczas przesyłania, więc nie oznacza to nawet wczesnego wychwytywania błędów podczas kompilowania. Mogę również zmienić rzutowanie na ciąg i żadne ostrzeżenie nie zostanie wygenerowane, pomimo konfliktu z tym atrybutem.

Odpowiedz

23

Możesz potencjalnie lykorzystać z ValueConversionAttribute, aby określić, jakie typy są zaangażowane w konwertery i wykorzystywać te informacje z pożytkiem. Spójrz na Piping Value Converters in WPF jako doskonały przykład do korzystania z ValueConversionAttribute.

Przykład pokazuje, jak wiele klas konwertera może być powiązane, a funkcja ValueConversion może być używana do przekazywania informacji o typie do następnego konwertera w linii.

[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, to powinna być odpowiedź, ponieważ pokazuje programową potrzebę/użycie atrybutu. Świetne znalezisko. – MarqueIV

12

To tylko adnotacja.

MSDN:

Przy wdrażaniu interfejs IValueConverter, jest to dobra praktyka, aby ozdobić realizację z ValueConversionAttribute atrybutu do wskazania narzędzi programistycznych typy danych zaangażowanych w konwersję

Nie wiem, co by zrobiły "narzędzia programistyczne" z tą informacją ...

+0

Łatwiej jest pisać takie informacje w komentarzach. Może jest używany do generowania dokumentacji? – Lars

+0

@Lars: Kto wie, jeszcze nie zauważyłem, że jest przydatny ... –

+8

Uh-huh ... Cóż, przynajmniej mam cel w moim życiu - napisz dodatek Visual Studio, aby użyć tego atrybut. – Lars

Powiązane problemy