कैसे एक पूर्णांक के रूप में पास करने के लिए ConverterParameter?


95

मैं एक पूर्णांक संपत्ति के लिए बाध्य करने की कोशिश कर रहा हूँ:

<RadioButton Content="None"
             IsChecked="{Binding MyProperty,
                         Converter={StaticResource IntToBoolConverter},
                         ConverterParameter=0}" />

और मेरा कन्वर्टर है:

[ValueConversion(typeof(int), typeof(bool))]
public class IntToBoolConverter : IValueConverter
{
    public object Convert(object value, Type t, object parameter, CultureInfo culture)
    {
        return value.Equals(parameter);
    }

    public object ConvertBack(object value, Type t, object parameter, CultureInfo culture)
    {
        return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
    }
}

समस्या यह है कि जब मेरे कन्वर्टर को पैरामीटर स्ट्रिंग कहा जाता है। मुझे इसे पूर्णांक बनाने की आवश्यकता है। बेशक मैं स्ट्रिंग को पार्स कर सकता हूं, लेकिन क्या मुझे करना है?

किसी भी मदद के लिए धन्यवाद konstantin


2
क्या किसी को पता है कि विंडोज फोन प्लेटफॉर्म पर इसे कैसे प्राप्त किया जाए जहां हमारे पास बाइंडिंग के लिए थोड़ा अलग वाक्यविन्यास है? {बाइंडिंग प्रॉपर्टी, कन्वर्टर = {StaticResource MYCONVERTER}, ConverterParameter = INT_VAL} इस उदाहरण में INT_VAL को एक स्ट्रिंग के रूप में पारित किया जाएगा
Krzysztof Kaczor

जवाबों:


106

ये रहा!

<RadioButton Content="None"
             xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <RadioButton.IsChecked>
        <Binding Path="MyProperty"
                 Converter="{StaticResource IntToBoolConverter}">
            <Binding.ConverterParameter>
                <sys:Int32>0</sys:Int32>
            </Binding.ConverterParameter>
        </Binding>
    </RadioButton.IsChecked>
</RadioButton>

ट्रिक में बुनियादी सिस्टम प्रकारों के लिए नाम स्थान शामिल करना और फिर तत्व रूप में कम से कम कन्वर्टरपेयर बाइंडिंग लिखना है।


2
यह इस तथ्य के प्रकार में परिवर्तन नहीं होता IValueConverter.Convert()है "पैरामीटर" पैरामीटर है object। आपको अभी भी इसे कास्ट / पार्स करना है ...
दान J

6
@djacobson - सच है, लेकिन यह है कि ValueConversion विशेषता आपको निर्दिष्ट करने की अनुमति देती है। बिल्कुल निश्चित नहीं है कि क्या यह वास्तव में संकलन-समय या रन-टाइम पर उपयोग किया जाता है। मूल पोस्टर प्रश्न के संदर्भ में उन्होंने कहा कि "मुझे पूर्णांक बनाने की आवश्यकता है। बेशक मैं स्ट्रिंग को पार्स कर सकता हूं, लेकिन क्या मुझे करना है?" तो मेरा जवाब यह बताता है कि इसमें स्ट्रिंग की पार्सिंग नहीं है, बल्कि केवल एक पूर्णांक का अनबॉक्सिंग है जो मैं अभी भी बहुत अधिक सुरक्षित है।
जिपरसन

51

पूर्णता के लिए, एक और संभव समाधान (शायद कम टाइपिंग के साथ):

<Window
    xmlns:sys="clr-namespace:System;assembly=mscorlib" ...>
    <Window.Resources>
        <sys:Int32 x:Key="IntZero">0</sys:Int32>
    </Window.Resources>

    <RadioButton Content="None"
                 IsChecked="{Binding MyProperty,
                                     Converter={StaticResource IntToBoolConverter},
                                     ConverterParameter={StaticResource IntZero}}" />

(बेशक, के Windowसाथ प्रतिस्थापित किया जा सकता है UserControl, और IntZeroवास्तविक उपयोग के स्थान के करीब परिभाषित किया जा सकता है।)


44

यह सुनिश्चित नहीं है कि WPFलोगों का उपयोग करने की दिशा में विनिवेश क्यों होता है MarkupExtension। यहां बताई गई समस्या सहित कई समस्याओं के लिए यह सही समाधान है।

public sealed class Int32Extension : MarkupExtension
{
    public Int32Extension(int value) { this.Value = value; }
    public int Value { get; set; }
    public override Object ProvideValue(IServiceProvider sp) { return Value; }
};

यदि यह मार्कअप एक्सटेंशन XAMLनामस्थान 'm' में उपलब्ध है , तो मूल पोस्टर का उदाहरण बन जाता है:

<RadioButton Content="None"
             IsChecked="{Binding MyProperty,
                         Converter={StaticResource IntToBoolConverter},
                         ConverterParameter={m:Int32 0}}" />

यह काम करता है क्योंकि मार्कअप एक्सटेंशन पार्सर मजबूत प्रकार के कंस्ट्रक्टर तर्क को देख सकता है और तदनुसार परिवर्तित कर सकता है, जबकि बाइंडिंग कन्वर्टरपर्मेट तर्क (कम-जानकारीपूर्ण) ऑब्जेक्ट-टाइप है।


धन्यवाद, यह उपयोगी था। यह मेरा पहला एक्सएएमएल विस्तार होगा। लेकिन मुझे लगता है इसे बनाने के लिए बेहतर है Valueएक objectके बजाय intउस में हर बार मुक्केबाजी से बचने के लिए, ProvideValue। (और फिर, इसे privateसीधे कुछ अवैध बताए जाने से बचने के लिए बनाएं )।
ज़ीउस

1
@Zeus आमतौर ProvideValueपर केवल एक बार मार्कअप एक्सटेंशन इंस्टेंस कहा जाता है, इसलिए मुक्केबाजी केवल एक बार भी होनी चाहिए। कंस्ट्रक्टर में नहीं करने से, मैं बॉक्सिंग से पूरी तरह से बचता हूं अगर ProvideValueकभी नहीं कहा जाता है। Valueनिजी बनाने के लिए, यह XAMLऑब्जेक्ट एलीमेंट सिंटैक्स में मार्कअप एक्सटेंशन का उपयोग करने के लिए प्रेरित करेगा
ग्लेन स्लेडेन

आपका अंतिम पैराग्राफ गलत है। इसे प्रकार रूपांतरण कहा जाता है और यह गुणों पर भी लागू होता है। बात यह है कि, Binding.ConverterParameterइसका कोई विशिष्ट प्रकार नहीं है (यह सिर्फ एक है object) इसलिए पार्सर को पता नहीं है कि क्या रूपांतरण लागू करना है, इसलिए प्रत्येक शाब्दिक को केवल एक स्ट्रिंग के रूप में माना जाता है।
HB

(इसलिए यदि आपके एक्सटेंशन में डिफॉल्ट कंस्ट्रक्टर है, तो {m:Int32 Value=0}वह भी ठीक काम करेगा।)
एचबी

5

उपयोग न करें value.Equals। उपयोग:

  Convert.ToInt32(value) == Convert.ToInt32(parameter)

8
आप का उपयोग क्यों नहीं करना चाहते हैं value.Equals?
ज़ैक

1

किसी भी तरह से XAML में कन्वर्टरव्यू के लिए टाइप जानकारी व्यक्त करना अच्छा होगा, लेकिन मुझे नहीं लगता कि यह अब तक संभव है। इसलिए मुझे लगता है कि आपको अपने कस्टम प्रकार के कनवर्टर ऑब्जेक्ट को कुछ कस्टम तर्क द्वारा पार्स करना होगा। मुझे दूसरा रास्ता नहीं दिख रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.