source

Value Conversion Attribute 클래스의 포인트?

gigabyte 2023. 4. 14. 21:45
반응형

Value Conversion Attribute 클래스의 포인트?

이 Atribute의 요점은 무엇입니까?추가한 후에도 가치 오브젝트를 캐스트해야 합니다.

[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에서 String으로 변경하면 Visual Studio에서 잘못된 유형에 대한 경고가 표시되지 않고 캐스팅 시에만 예외가 발생하므로 컴파일 중 초기 오류 캐치에서도 아무런 의미가 없습니다.또한 캐스트를 문자열로 변경할 수 있으며 이 Attribute와 충돌하더라도 경고가 발생하지 않습니다.

다음 명령어를 사용할 수 있습니다.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>

그것은 단지 주석일 뿐이다.

MSDN:

IValueConverter 인터페이스를 구현할 때는 ValueConversionAttribute Atribute Atribute Atribute를 사용하여 구현을 꾸미는 것이 좋습니다.

'개발도구'가 그 정보로 무엇을 할 수 있을지는 모르겠지만...

언급URL : https://stackoverflow.com/questions/9628859/the-point-of-valueconversionattribute-class

반응형