Pertanyaan Titik dari kelas ValueConversionAttribute?


Apa maksud dari atribut ini? Setelah menambahkannya saya masih perlu membuat gips pada objek nilai.

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

Apakah hanya untuk pembacaan kode? Karena ketika saya mengubah jalur pengikatan ke String di xaml, Visual Studio tidak memberikan peringatan tentang tipe yang salah dan pengecualian hanya dilemparkan ketika casting, jadi itu tidak berarti apa-apa bahkan dalam kesalahan awal penangkapan saat kompilasi. Saya juga dapat mengubah cast ke string dan tidak ada peringatan yang dilemparkan meskipun bertentangan dengan Atribut ini.


32
2018-03-09 04:16


asal


Jawaban:


Anda berpotensi menggunakan ValueConversionAttribute untuk menentukan jenis apa yang terlibat dalam konverter, dan gunakan informasi itu dengan bermanfaat. Melihat Konversi Nilai Perpipaan di WPF sebagai contoh yang sangat bagus untuk penggunaan ValueConversionAttribute.

Contoh ini menunjukkan bagaimana beberapa kelas konverter dapat dirantai, dan ValueConversion dapat digunakan untuk menyampaikan info jenis ke konverter berikutnya secara berurutan.

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

25
2017-11-05 17:14



Itu hanya sebuah anotasi.

MSDN:

Ketika mengimplementasikan antarmuka IValueConverter, itu adalah praktik yang baik untuk menghias implementasi dengan ValueConversionAttribute atribut untuk menunjukkan kepada alat pengembangan tipe data yang terlibat dalam konversi

Saya tidak tahu apa yang "alat pengembangan" lakukan dengan informasi itu ...


12
2018-03-09 04:32