Смысл класса ValueConversionAttribute? - PullRequest
37 голосов
/ 09 марта 2012

Какой смысл этого атрибута? После добавления мне все еще нужно сделать объект приведения значения.

[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;

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

Ответы [ 2 ]

27 голосов
/ 05 ноября 2014

Вы можете потенциально использовать ValueConversionAttribute, чтобы определить, какие типы задействованы в преобразователях, и использовать эту информацию с пользой. Посмотрите на Преобразователи значений трубопроводов в 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>
14 голосов
/ 09 марта 2012

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

MSDN :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...