2012-03-09 14 views
30

इस विशेषता का क्या मतलब है? इसे जोड़ने के बाद भी मुझे मूल्य वस्तु पर एक कास्ट बनाने की जरूरत है।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; 

क्या यह केवल कोड पठनीयता के लिए है? क्योंकि जब मैं xaml में स्ट्रिंग के लिए बाध्यकारी पथ बदलता हूं, तो विजुअल स्टूडियो गलत प्रकार के बारे में चेतावनी नहीं देता है और केवल कास्टिंग करते समय अपवाद फेंक दिया जाता है, इसलिए इसका मतलब यह नहीं है कि संकलन करते समय प्रारंभिक त्रुटि को पकड़ने में भी कोई चीज नहीं है। मैं स्ट्रिंग में एक कलाकार भी बदल सकता हूं और इस विशेषता के साथ संघर्ष करने के बावजूद कोई चेतावनी नहीं फेंक दी गई है।

उत्तर

23

आप संभावित कर सकते हैं कनवर्टर्स में किस प्रकार शामिल हैं, और यह जानकारी उपयोगी रूप से उपयोग करने के लिए ly ValueConversionAttribute का उपयोग करें। Piping Value Converters in WPFValueConversionAttribute के उपयोग के लिए एक उत्कृष्ट उदाहरण के रूप में देखें।

उदाहरण दिखाता है कि एकाधिक कनवर्टर कक्षाओं को कैसे जंजीर किया जा सकता है, और मूल्य कनवर्टर का उपयोग लाइन में अगली कनवर्टर को टाइप करने के लिए किया जा सकता है।

[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

आईएमएचओ, यह जवाब होना चाहिए क्योंकि यह विशेषता की प्रोग्रामेटिक आवश्यकता/उपयोग दिखाता है। महान खोज – MarqueIV

12

यह सिर्फ एक टिप्पणी है।

MSDN:

जब IValueConverter इंटरफेस को लागू करने, यह विकास उपकरण के लिए रूपांतरण में शामिल डेटा प्रकार इंगित करने के लिए एक ValueConversionAttribute विशेषता के साथ कार्यान्वयन को सजाने के लिए एक अच्छा अभ्यास है

मुझे नहीं पता कि "विकास उपकरण" उस जानकारी के साथ क्या करेगा ...

+0

टिप्पणियों में ऐसी जानकारी लिखना आसान है। शायद यह ऑटो जनरेटिंग दस्तावेज के लिए प्रयोग किया जाता है? – Lars

+0

@ लार्स: कौन जानता है, इसे अभी तक कहीं भी उपयोगी नहीं देखा है ... –

+8

उह-हुह ... ठीक है कम से कम मुझे अपने जीवन में एक उद्देश्य मिला है - इसका उपयोग करने के लिए एक विजुअल स्टूडियो ऐड-इन लिखें विशेषता। – Lars

संबंधित मुद्दे