2011-04-11 14 views
5

मैं निम्नलिखित कनवर्टरएक सामान्य बूलियन कन्वर्टर

[ValueConversion(typeof(bool), typeof(Visibility))] 
public sealed class BoolToVisibilityConverter : IValueConverter 
{ 
    public Visibility TrueValue { get; set; } 
    public Visibility FalseValue { get; set; } 

    public BoolToVisibilityConverter() 
    { 
     // set defaults 
     TrueValue = Visibility.Visible; 
     FalseValue = Visibility.Collapsed; 
    } 

    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     if (!(value is bool)) 
      return null; 
     return (bool)value ? TrueValue : FalseValue; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     if (Equals(value, TrueValue)) 
      return true; 
     if (Equals(value, FalseValue)) 
      return false; 
     return null; 
    } 
} 
<conv:BoolConverter x:Key="enableStyleConvertor" TrueValue="Visible" FalseValue="Collapsed" /> 

वहाँ यह अधिक सामान्य बनाने के लिए एक तरह से, है यानी यह वस्तु के किसी भी प्रकार के लौट सकते हैं?

+0

बस यह सुनिश्चित करने के लिए: आप जानते हैं कि [System.Windows.Controls.BooleanToVisibilityConverter] (http://msdn.microsoft.com/en-us/library/system.windows.controls.booleantovisibilityconverter.aspx) पहले से मौजूद है ? – Heinzi

+0

हां, यह मेरे बिंदु – Marcom

+0

को समझाने के लिए सिर्फ एक पुराना स्निपेट है, आप इस विषय पर अपनी हाल की पोस्ट को देखना चाहेंगे: http://kentb.blogspot.com/2011/02/booleantovisibilityconverter.html –

उत्तर

3

आप केवल ऑब्जेक्ट के TrueValue और FalseValue बनाते हैं। आप यह देखने के लिए बराबर कोड अपडेट करना चाहेंगे कि ऑब्जेक्ट IComparable को लागू करते हैं या नहीं।

[ValueConversion(typeof(bool), typeof(object))] 
public sealed class MyConverter : IValueConverter 
{ 
    public object TrueValue { get; set; } 
    public object FalseValue { get; set; } 

    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     if (!(value is bool)) 
      return null; 
     return (bool)value ? TrueValue : FalseValue; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     if (IsEqual(value, TrueValue)) 
      return true; 
     if (IsEqual(value, FalseValue)) 
      return false; 
     return null; 
    } 

    private static bool IsEqual(object x, object y) { 
     if (Equals(x, y)) 
      return true; 

     IComparable c = x as IComparable; 
     if (c != null) 
      return (c.CompareTo(y) == 0); 

     return false; 
    } 
} 

इस का उपयोग करने के लिए आप स्पष्ट रूप से अब हालांकि मान निर्धारित करने होंगे:

<local:MyConverter> 
    <local:MyConverter.TrueValue> 
     <Visibility>Visible</Visibility> 
    </local:MyConverter.TrueValue> 
    <local:MyConverter.FalseValue> 
     <Visibility>Collapsed</Visibility> 
    </local:MyConverter.FalseValue> 
</local:MyConverter> 

संपादित करें:

एक जेनेरिक वर्जन इस प्रकार दिखाई देगा:

[ValueConversion(typeof(bool), typeof(object))] 
public sealed class MyConverter<T> : IValueConverter { 
    public T TrueValue { get; set; } 
    public T FalseValue { get; set; } 

    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) { 
     if (!(value is bool)) 
      return null; 
     return (bool)value ? TrueValue : FalseValue; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) { 
     if (IsEqual(value, TrueValue)) 
      return true; 
     if (IsEqual(value, FalseValue)) 
      return false; 
     return null; 
    } 

    private static bool IsEqual(object x, object y) { 
     if (Equals(x, y)) 
      return true; 

     IComparable c = x as IComparable; 
     if (c != null) 
      return (c.CompareTo(y) == 0); 

     return false; 
    } 
} 

यह XAML से आसानी से सुलभ नहीं है। एक्सएएमएल 200 9 में जेनेरिक के लिए कुछ additional support है, लेकिन यह ज्यादातर loose XAML files (यानी संकलित नहीं है) के लिए है।

+0

यदि वे हैं ऑब्जेक्ट टाइप करें, एक्सएएमएल कैसे पता चलेगा कि 'TrueValue = "Visible" को 'myBoolConverter.TrueValue = System.Windows.Visibility.Visible' में बदलने की आवश्यकता है, उदाहरण के लिए, स्ट्रिंग" दृश्यमान "? – Heinzi

+0

@ हिनजी - हाँ, यह एक चीज है जिसे आप छोड़ देते हैं। आपको मूल्यों को स्पष्ट रूप से परिभाषित करना होगा। मैं अपना जवाब अपडेट करूंगा। – CodeNaked

+0

@ हिनजी - अपडेट किया गया। – CodeNaked

1

मैं बस दो वर्गों का प्रयोग करेंगे,

BooleanToVisibilityConverter (Visible on true) 
OppositeBooleanToVisibilityConverter (Visible on false) 

या मैं एक कनवर्टर पैरामीटर "उलटा" कहा जाता है

<Button 
    Visibility="{Binding myValue, 
     Converter={StaticResource booleanToVisibility}, 
     ConverterParameter=inverse}" /> 

तुम तो उलटा जांच कर सकते हैं ConverterParameter में पारित किया जा रहा गुजरती हैं और झूठे पर दृश्यमान वापस आ जाएगी ।

आप कनवर्टर पैरामीटर पर कुछ भी पास कर सकते हैं या यह आपके तर्क को नियंत्रित करने वाले कुछ भी हो सकता है।

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