2012-03-09 3 views
30

В чем смысл этого атрибута? После его добавления мне все равно нужно сделать объект на объекте value.Точка класса 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; 

Это только для чтения кода? Потому что, когда я изменяю путь привязки к String в xaml, Visual Studio не дает предупреждения о некорректном типе, и исключение генерируется только при кастинге, поэтому это не значит, что даже при раннем обнаружении ошибок при компиляции. Я также могу изменить приведение в строку и не вызывать предупреждения, несмотря на то, что это противоречит этому атрибуту.

ответ

23

Вы можете потенциально ly используйте ValueConversionAttribute, чтобы определить, какие типы задействованы в конвертерах, и использовать эту информацию с пользой. Посмотрите на Piping Value Converters in WPF как отличный пример использования ValueConversionAttribute.

В примере показано, как несколько классов преобразователей могут быть закодированы, а ValueConversion может использоваться для передачи информации о типе в следующий конвертер в строке.

[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, это должен быть ответ, потому что он показывает программную потребность/использование атрибута. Отличная находка. – MarqueIV

12

Это просто аннотация.

MSDN:

При реализации интерфейса IValueConverter, это хорошая практика, чтобы украсить реализацию с ValueConversionAttribute атрибут для указания инструментов разработки типов данных, участвующих в преобразовании

Я не знаю, что «инструменты для разработки» будут делать с этой информацией ...

+0

Это легче написать такую ​​информацию в комментариях. Может быть, он используется для автоматической генерации документации? – Lars

+0

@Lars: Кто знает, еще не видел, что он еще полезен где-то еще ... –

+8

Угу ... Ну, по крайней мере, у меня есть цель в моей жизни - напишите надстройку Visual Studio, чтобы использовать это атрибут. – Lars