2009-10-20 17 views
34

मैं एक नियंत्रण है कि मैं/छिपाने दिखाने के लिए, एक बूलियन के मूल्य के आधार चाहते हैं।डब्ल्यूपीएफ: 1 बाध्यकारी में 2 कन्वर्टर्स का उपयोग कैसे करें?

मैं एक NegatedBooleanConverter (गलत और इसके विपरीत सच स्विच) है और मैं पहली बार इस कनवर्टर चलाने की जरूरत है। मैं एक BooleanToVisibilityConverter है और मैं NegatedBoolConverter के बाद इस कनवर्टर चलाने की जरूरत है।

मैं इस समस्या को कैसे ठीक कर सकता हूं? मैं इसे एक्सएएमएल में करना चाहता हूं।

संपादित करें: this is a possible solution.

कि काम करने के लिए प्रतीत नहीं होता। यह पहले अलग कन्वर्टर्स के साथ मान को परिवर्तित करता है और फिर परिवर्तित मूल्यों के साथ कुछ करता है।

क्या मैं जरूरत है:

  • पहला कनवर्टर के साथ मूल्य कन्वर्ट (इस convertedValue देता है)।
  • दूसरा कनवर्टर के साथ convertedValue कन्वर्ट और यह इस परिणाम है कि मैं जरूरत है।
+0

हां, जो समाधान आपने लिंक किया है वह शायद सबसे अच्छा है ... –

+0

यह भी देखें [एक्सएएमएल में एकाधिक कनवर्टर्स चेनिंग] (http://stackoverflow.com/q/2607490/2032064) – Mifeet

+0

टाउन ने इसे सर्वश्रेष्ठ [यहां] (http://stackoverflow.com/a/8326207/526704), उसका समाधान आपको जितना चाहें उतना चेन करने देता है, जेबर्जर के उत्तर के समान, लेकिन यह एक और अधिक सुरुचिपूर्ण और कार्यान्वयन में छोटा है – DLeh

उत्तर

0

फिर अपने ही सवाल का जवाब देने http://www.codeproject.com/Articles/15061/Piping-Value-Converters-in-WPF

यह 2 मौजूदा कन्वर्टर्स की एक नई कनवर्टर बनाता है, पहले को पहले कॉल करना, और फिर दूसरा आदि इत्यादि

मैं इस समाधान से बहुत खुश हूं।

0

मैंने अभी बनाया है जिसे मैंने रिवर्स्डबोलियन ट्वॉसिबिलिटी कनवर्टर कहा है जो मूल रूप से उन 2ों के लिए करेगा जो आपके लिए करेंगे लेकिन एक चरण में।

+0

हां, यह संभव होगा समाधान, लेकिन मैं एक समाधान पसंद करता हूं जहां मैं पहिया को फिर से शुरू किए बिना अपने वर्तमान कन्वर्टर्स का पुन: उपयोग कर सकता हूं। यदि वह समाधान मौजूद है ... – Natrium

0

इस विशिष्ट समस्या को हल करने के लिए, दो कन्वर्टर्स का उपयोग करने के बजाय आप अपने स्वयं के BoolToVisibilityConverter लिख सकते हैं जो कनवर्टर पैरामीटर (एक बूल के रूप में) का उपयोग करता है यह निर्धारित करने के लिए कि मूल बूलियन को अस्वीकार करना है या नहीं।

+0

हां, यह एक संभावित समाधान होगा, लेकिन मैं एक समाधान पसंद करता हूं जहां मैं पहिया को फिर से शुरू किए बिना अपने वर्तमान कन्वर्टर्स का पुन: उपयोग कर सकता हूं। यदि वह समाधान मौजूद है ... – Natrium

0

निजी तौर पर मैं सिर्फ 1 सिंगल कनवर्टर कि पूर्ण रूपांतरण करता होगा। जब तक आप सख्त कन्वर्टर्स अन्य स्थानों में (निषेध) की तरह की जरूरत है, इसे बनाए रखने (IMO) यदि रूपांतरण एक ही स्थान पर एक बार किया जाता है, आसान हो जाएगा।

+1

हां, यह एक संभावित समाधान होगा, लेकिन मैं एक समाधान पसंद करता हूं जहां मैं पहिया को फिर से शुरू किए बिना अपने वर्तमान कन्वर्टर्स का पुन: उपयोग कर सकता हूं। यदि वह समाधान मौजूद है ... – Natrium

0

मुझे लगता है कि आप दो अलग कन्वर्टर्स के बजाय यहां एक मल्टीकोनवर्टर का उपयोग करना चाह सकते हैं। आप अपने मौजूदा कन्वर्टर्स से तर्क का पुन: उपयोग करने में सक्षम होना चाहिए। शुरुआत के लिए this discussion देखें।

3

हमारे प्रोजेक्ट में हम जो करते हैं वह नियमित बूलियन ट्वॉसिबिलिटी कनवर्टर बनाता है, कहा जाता है कि कनवर्टर एक पैरामीटर लेता है (कुछ भी, एक स्ट्रिंग, एक इंट, बूल, जो कुछ भी)। यदि पैरामीटर सेट किया गया है तो यह परिणाम को बदल देता है, यदि नहीं, तो यह नियमित परिणाम निकाल देता है।

public class BooleanToVisibilityConverter : IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool? isVisible = value as bool?; 
     if (parameter != null && isVisible.HasValue) 
      isVisible = !isVisible; 
     if (isVisible.HasValue && isVisible.Value == true) 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 

    #endregion 
} 
+1

xaml में इस कनवर्टर को कैसे कॉल करें? – Natrium

49

यह मैं क्या किया है:

public class CombiningConverter : IValueConverter 
    { 
     public IValueConverter Converter1 { get; set; } 
     public IValueConverter Converter2 { get; set; } 

     #region IValueConverter Members 

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      object convertedValue = Converter1.Convert(value, targetType, parameter, culture); 
      return Converter2.Convert(convertedValue, targetType, parameter, culture); 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 

और मैं इसे इस तरह कहते हैं:

<converters:CombiningConverter x:Key="negatedBoolToVisibilityConverter" Converter1="{StaticResource NegatedBooleanConverter}" Converter2="{StaticResource BoolToVisibilityConverter}" /> 

एक MultiValueConverter भी संभव मुझे लगता है कि हो सकता है। शायद मैं बाद में कोशिश करूंगा।

+0

यह अच्छा है ... – MoonKnight

23

Natrium के महान उत्तर पर विस्तार ...

XAML

<conv:ConverterChain x:Key="convBoolToInverseToVisibility"> 
    <conv:BoolToInverseConverter /> 
    <BooleanToVisibilityConverter /> 
</conv:ConverterChain> 

कक्षा

/// <summary>Represents a chain of <see cref="IValueConverter"/>s to be executed in succession.</summary> 
[ContentProperty("Converters")] 
[ContentWrapper(typeof(ValueConverterCollection))] 
public class ConverterChain : IValueConverter 
{ 
    private readonly ValueConverterCollection _converters= new ValueConverterCollection(); 

    /// <summary>Gets the converters to execute.</summary> 
    public ValueConverterCollection Converters 
    { 
     get { return _converters; } 
    } 

    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Converters 
      .Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture)); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Converters 
      .Reverse() 
      .Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture)); 
    } 

    #endregion 
} 

/// <summary>Represents a collection of <see cref="IValueConverter"/>s.</summary> 
public sealed class ValueConverterCollection : Collection<IValueConverter> { } 
+3

यह [आलेख] (http://www.codeproject.com/KB/WPF/PipingValueConverters_WPF.aspx) का समाधान रन-टाइम टाइप-चेकिंग प्रदान करता है। –

+1

यह कनवर्टर्स को गलत लक्ष्य टाइप पास करता है। यह गंतव्य कन्वर्टर्स को सभी कन्वर्टर्स को टाइप करेगा, जो कि शुरुआती प्रश्न के परिदृश्य में भी गलत है। "दृश्यता" का प्रकार पहले कनवर्टर को पास किया जाता है, जब लक्ष्य प्रकार वास्तव में "बूल" होता है। – CodePB

3

इस मामले में, आप एक कनवर्टर श्रृंखला की जरूरत नहीं है। आपको बस कॉन्फ़िगर करने योग्य कनवर्टर की आवश्यकता है। यह ऊपर कार्लो के उत्तर के समान है, लेकिन स्पष्ट रूप से सत्य और झूठे मूल्यों को परिभाषित करता है (जिसका अर्थ है कि आप छुपा, दृश्यमान या संक्षिप्त रूपांतरणों के लिए समान कनवर्टर्स का उपयोग कर सकते हैं)।

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

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

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

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

फिर XAML में: अब साल के लिए मैं इस समाधान का उपयोग किया गया है::

<BoolToVisibilityConverter x:Key="BoolToVisibleConverter" 
           FalseValue="Hidden" 
           TrueValue="Visible" /> 
+1

यदि आप एक्सएएमएल 200 9 का उपयोग कर सकते हैं, तो आप यह सामान्य भी बना सकते हैं। विशेषता वाक्यविन्यास: 'कनवर्टर = {सी: बूलियन कनवर्टर (दृश्यता) सही = दृश्यमान, गलत = संक्षिप्त)' तत्व वाक्यविन्यास: '' यदि आप एक्सएएमएल 200 9 का उपयोग नहीं कर सकते हैं, तो भी आप बेस क्लास जेनेरिक बना सकते हैं लेकिन आपको प्रत्येक सामान्य प्रकार के लिए कंक्रीट व्युत्पन्न कक्षाओं की आवश्यकता होती है। –

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