WPF बाइंडिंग में शून्य करने के लिए मान सेट करें


116

कृपया निम्नलिखित लाइन पर एक नज़र डालें

<TextBox Text="{Binding Price}"/>

ऊपर से यह मूल्य संपत्ति एक Decimal?(अशक्त दशमलव) है।

मैं चाहता हूं कि यदि उपयोगकर्ता टेक्स्टबॉक्स की सामग्री को हटाता है (यानी खाली स्ट्रिंग में प्रवेश करता है, तो इसे नल के साथ स्वचालित रूप से अद्यतन स्रोत होना चाहिए (VB में कुछ भी नहीं)।

इस पर कोई विचार कि मैं इसे 'Xamly' कैसे कर सकता हूँ?

जवाबों:


226

मैं .NET 3.5 SP1 का उपयोग कर रहा हूं इसलिए यह बहुत सरल है:

<TextBox Text="{Binding Price, TargetNullValue=''}"/>

जो खड़ा है (आपकी टिप्पणी के लिए धन्यवाद ग्रेगर):

<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>

sysके लिए आयातित xml नाम स्थान Systemहै mscorlib:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

उम्मीद है कि मदद की।


13
वास्तव में TargetNullValue ठीक काम करता है। यह जो करता है वह दिए गए मूल्य और अशक्त के बीच एक समानता निर्धारित करता है। तो इस मामले में जब बाध्य मान शून्य है, तो यह एक रिक्त स्ट्रिंग प्रदर्शित करेगा और जब लक्ष्य का मान रिक्त स्ट्रिंग है तो यह बाध्य मान को शून्य करने के लिए सेट करेगा।
ब्रायन एंडरसन

4
TargetNullValue काम करता है। वैल्यू कन्वर्टर का उपयोग करते समय मुझे वही परिणाम मिले। आप अभिव्यक्ति को सरल भी बना सकते हैं: <TextBox Text = "{बाइंडिंग प्राइस, TargetNullValue = ''}" />
ग्रेगर गुलाम

2
मैं उलझन में हूँ - ओपी कहता है: ".. इसे स्वचालित रूप से स्रोत को शून्य के साथ अद्यतन करना चाहिए [जब लक्ष्य एक खाली स्ट्रिंग है]।", लेकिन TargetNullValue लक्ष्य को अद्यतन करता है , स्रोत को नहीं !
अंकन जूल

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

@markmnl जबकि TargetNullValue वास्तव में अद्यतन करने के लिए अभिप्रेत है- Targetऔर नहीं Source, यह समाधान अभी भी किसी कारण से करता है (मुझे पता नहीं चल पाया कि क्यों)।
टिम पोहलमन

12

इस मान कनवर्टर को चाल करना चाहिए:

public class StringToNullableDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
        CultureInfo culture)
    {
        decimal? d = (decimal?)value;
        if (d.HasValue)
            return d.Value.ToString(culture);
        else
            return String.Empty;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        string s = (string)value;
        if (String.IsNullOrEmpty(s))
            return null;
        else
            return (decimal?)decimal.Parse(s, culture);
    }
}

इस कन्वर्टर के उदाहरणों को ressources में घोषित करें:

<Window.Resources>
    <local:StringToNullableDecimalConverter x:Key="nullDecimalConv"/>
</Window.Resources>

और इसे अपने बंधन में उपयोग करें:

<TextBox Text="{Binding Price, Converter={StaticResource nullDecimalConv}}"/>

ध्यान दें कि TargetNullValueयहां उपयुक्त नहीं है: यह परिभाषित करने के लिए उपयोग किया जाता sourceहै कि बाध्यकारी के शून्य होने पर किस मूल्य का उपयोग किया जाना चाहिए । यहाँ Priceस्रोत नहीं है, यह स्रोत की एक संपत्ति है ...


2
एक कनवर्टर ऐसा करने का उचित तरीका है, और आप इन कन्वर्टर्स को XAML में परिभाषित नहीं कर सकते हैं। कन्वर्टर्स आपको डेटा-बाइंडिंग में डिफ़ॉल्ट "ऑब्जेक्ट टू ऑब्जेक्ट" रूपांतरण व्यवहार को बदलने की अनुमति देता है, जो कि आप करना चाहते हैं।
विल एडिडिन्स

मेरे मामले में समस्या यह है कि मैं पहले से ही यहां एक अभिसरण का उपयोग करता हूं जो दूसरी बात करता है। मैंने जवाब पोस्ट किया, कृपया देख लें।
शिम्मी वेइटहैंडलर

"nullOrWhiteSpace () को अनुमति देने के लिए" "का उपयोग शून्य के रूप में गिना जा सकता है (शायद आप जो चाहते हैं)
Simon_Weaver

+1 हालांकि: मूल्य यहां आपका स्रोत है, लेकिन आप सही हैं। टारगैनलवैल्यू यहां उपयुक्त नहीं है - टारगेट NullValue लक्ष्य को तब सेट करता है जब स्रोत शून्य है - जबकि हम स्रोत को सेट करना चाहते हैं (शून्य करने के लिए) जब लक्ष्य एक निश्चित मूल्य (खाली) हो स्ट्रिंग) - जो आपके कनवर्टर करता है।
मार्मन

5

आप एक ValueConverter (IValueConverter) http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx का उपयोग करके देख सकते हैं

यहाँ मेरे सिर के पीछे, कुछ इस तरह है:

public class DoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        return (double)value;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
    var doubleValue = Convert.ToDouble(value);

    return (doubleValue == 0 ? null : doubleValue);
    }
}

(हालांकि कुछ tweaking की आवश्यकता हो सकती है)


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