2012-03-09 17 views
30

Bu özelliğin amacı nedir? Ekledikten sonra yine de değer nesnesinde bir cast yapmaya ihtiyacım var.ValueConversionAttribute sınıfı noktası?

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

Yalnızca kod okunabilirliği için mi? Çünkü bir bağlama'nın xaml'deki bir String yolunu değiştirdiğimde, Visual Studio yanlış türde bir uyarı vermiyor ve yalnızca döküm işlemi sırasında istisna atılıyor, bu yüzden derleme sırasında erken hata yakalamada bile bir şey ifade etmiyor. Ayrıca bir yayın dizgesini değiştirebilir ve bu Öznitelikle çelişmesine rağmen bir uyarı atılmaz.

cevap

23

Potansiyel olabilirsiniz Çeviricilerde hangi türlerin yer aldığını belirlemek için ValueConversionAttribute kullanın ve bu bilgiyi yararlı bir şekilde kullanın. ValueConversionAttribute kullanımı için mükemmel bir örnek olarak Piping Value Converters in WPF'a bakın.

Örnek, birden fazla dönüştürücü sınıfının nasıl zincirlenebileceğini ve tür bilgisini satırdaki sonraki dönüştürücüye aktarmak için ValueConversion kullanılabileceğini gösterir.

[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, cevabın bu olması gerekir çünkü bu özellik, programın özellik/gereksinimini gösterir. Harika bul. – MarqueIV

12

Bu sadece bir ek açıklamadır.

MSDN:

IValueConverter arabirimini uygulayan, geliştirme araçları dönüşüm katılan veri türlerini belirtmek için ValueConversionAttribute özniteliği ile uygulanmasını süslemek için iyi bir uygulamadır

"Geliştirme araçlarının" bu bilgi ile ne yapacağını bilmiyorum ...

+0

Bu tür bilgileri yorumlarda yazmak daha kolaydır. Belki otomatik oluşturma belgeleri için kullanılır? – Lars

+0

@Lars: Kim bilir, henüz herhangi bir yerde yararlı olduğunu görmedim ... –

+8

Uh-huh ... Eh, en azından hayatımda bir amacım var - bunu kullanmak için bir Visual Studio eklentisi yaz bağlıyor. – Lars