WPF XAML बाइंडिंग में स्ट्रिंग जोड़ने के लिए StringFormat का उपयोग करें


125

मेरे पास एक WPF 4 अनुप्रयोग है जिसमें एक टेक्स्टब्लॉक होता है जिसमें पूर्णांक मान पर एक-तरफ़ा बाध्यकारी होता है (इस मामले में, डिग्री सेल्सियस में तापमान)। XAML इस तरह दिखता है:

<TextBlock x:Name="textBlockTemperature">
        <Run Text="{Binding CelsiusTemp, Mode=OneWay}"/></TextBlock>

यह वास्तविक तापमान मान प्रदर्शित करने के लिए ठीक काम करता है, लेकिन मैं इस मूल्य को प्रारूपित करना चाहता हूं, इसलिए इसमें केवल संख्या के बजाय ° C (केवल 30 के बजाय 30 ° C) शामिल है। मैं StringFormat के बारे में पढ़ रहा हूँ और मैंने इस तरह के कई सामान्य उदाहरण देखे हैं:

// format the bound value as a currency
<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" />

तथा

// preface the bound value with a string and format it as a currency
<TextBlock Text="{Binding Amount, StringFormat=Amount: {0:C}}"/>

दुर्भाग्य से, मैंने जो भी उदाहरण देखे हैं उनमें से कोई भी एक स्ट्रिंग को बाध्य मान में जोड़ दिया है जैसा कि मैं करने की कोशिश कर रहा हूं। मुझे यकीन है कि यह कुछ सरल हो गया है, लेकिन मुझे इसे खोजने का कोई सौभाग्य नहीं है। क्या कोई मुझे समझा सकता है कि मुझे यह कैसे करना है?

जवाबों:


218

आपका पहला उदाहरण प्रभावी रूप से आपको क्या चाहिए:

<TextBlock Text="{Binding CelsiusTemp, StringFormat={}{0}°C}" />

20
Xaml में स्ट्रिंग प्रारूप में अग्रणी खाली क्यों है {}?
जोन्सपोलिस

6
@ जोनासोपोलिस यह डॉक्स में है - लेकिन यदि आपका प्रारूप स्ट्रिंग ए के साथ शुरू होता है {, तो यह बचने के लिए एक तंत्र प्रदान करता है, क्योंकि {}पहले से ही xaml में अर्थ है।
रीड कोपसी

5
मैं यह नहीं देखता कि दस्तावेज़ीकरण प्रमुख {} को कहाँ बताता है।
एरिक

5
@ बहुत अधिक प्रलेखन की तरह, यह बदबू आ रही है - वे इसे डेमो करते हैं, लेकिन समझाते नहीं हैं।
रीड कोपसे

19
यहाँ रहस्यमयी {} का दस्तावेज: msdn.microsoft.com/en-us/library/ms744986.aspx
जोत्रियस

107

यहां एक विकल्प है जो पठनीयता के लिए अच्छी तरह से काम करता है यदि आपके पास स्ट्रिंग या कई बाइंडिंग के बीच में बाइंडिंग है:

<TextBlock>
  <Run Text="Temperature is "/>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>  
</TextBlock>

<!-- displays: 0°C (32°F)-->
<TextBlock>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>
  <Run Text=" ("/>
  <Run Text="{Binding Fahrenheit}"/>
  <Run Text="°F)"/>
</TextBlock>

6
मुझे यह उत्तर थोड़ा बेहतर लगता है क्योंकि मैं एक स्ट्रिंग लाइब्रेरी से आसानी से पाठ सम्मिलित कर सकता हूं। बेशक अगर आप वास्तव में अंतर्राष्ट्रीयकरण के बारे में चिंतित हैं, तो आप शायद एक कनवर्टर का उपयोग करना बेहतर होगा ताकि संख्या और इकाइयों का क्रम तय न हो। <रन टेक्स्ट = "{x: स्टेटिक s: UIStrings.General_FahrenheitAblookation}" />
मैट बेकर

1
यह एक महान समाधान है, लेकिन मुझे पाठ रन के बीच अंतिम पाठ प्रदर्शन में अतिरिक्त स्थान मिल रहा है - कोई विचार क्यों? आपके उदाहरण में मैं देखता हूं0 °C ( 32 °F)
कॉनरोड

यदि आप वास्तविक स्ट्रिंग प्रारूपण करना चाहते हैं (यानी दशमलव स्थानों की संख्या को नियंत्रित करना, आदि) यह सुपर उपयोगी नहीं है।
BrainSlugs83

5
@ कोनराड यदि आप प्रत्येक रन के बीच रिक्त स्थान नहीं चाहते हैं, तो आपको उन रनों को एक पंक्ति में निम्नानुसार रखना चाहिए: <TextBlock> <Run Text = "{बाइंडिंग सेल्सियस)" /> <Run Text = "° C" / > <रन टेक्स्ट = "(" /: <रन टेक्स्ट = "{बाइंडिंग फ़ारेनहाइट}" /> <रन टेक्स्ट = "° F)" /> </
टेक्स्टब्लॉक

94

कृपया ध्यान दें कि Bringings में StringFormat का उपयोग केवल "पाठ" गुणों के लिए काम करता है। लेबल के लिए इसका उपयोग करना। कॉन्टेंट काम नहीं करेगा


16
एक बहुत महत्वपूर्ण बिंदु जो मुझे तब तक कोशिश करता रहा जब तक कि मैं हताश नहीं हो गया और मेरे संदेह को मान्य करने के लिए यह टिप्पणी मिली।
डॉनबॉइटनॉट

64
ContentStringFormatबचाव के लिए आता है, उदाहरण Content="{Binding Path=TargetProjects.Count}" ContentStringFormat="Projects: {0}":।
ज्योतिषी

2
धन्यवाद कैस्पर, उस जानकारी को पोस्ट करने के लिए असली हीरो।
21

5
GridViewColumn हेडर के लिए, उपयोग करेंHeaderStringFormat="{}{0} For Report"
Felix

2
यदि आप डिज़ाइन समय डेटा का उपयोग कर रहे हैं, तो ऐसा लगता है कि डिज़ाइनर में प्रतिबिंबित करने के लिए सामग्री प्राप्त करने के लिए ContentStringFormat को संपादित करने के बाद आपको प्रोजेक्ट को फिर से बनाना होगा, जबकि StringFormat जैसा कि कहा जाता है कि टेक्स्ट बॉक्स वास्तविक समय में डिज़ाइनर को अपडेट कर देगा।
रिचर्ड मूर

-8

Xaml में

<TextBlock Text="{Binding CelsiusTemp}" />

में ViewModel, इस तरह से मान सेट भी काम करता है:

 public string CelsiusTemp
        {
            get { return string.Format("{0}°C", _CelsiusTemp); }
            set
            {
                value = value.Replace("°C", "");
              _CelsiusTemp = value;
            }
        }

19
यह व्यू-व्यूमॉडल पृथक्करण के पूरे बिंदु के खिलाफ जाता है
आस्कोलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.