एक WPF TextBlock के लिए कई मानों को कैसे बांधें?


210

मैं वर्तमान में TextBlockनीचे नामित संपत्ति के मूल्य को बांधने के लिए उपयोग कर रहा हूं Name:

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

अब, मैं उसी नाम की एक और संपत्ति को बांधना चाहता हूं ।IDTextBlock

क्या दो या अधिक मूल्यों को एक ही में बांधना संभव है TextBlock? क्या इसे सरल सहमति के साथ किया जा सकता है, जैसे Name + IDऔर यदि नहीं, तो यह कैसे और कैसे संपर्क किया जा सकता है?

जवाबों:


434

आप संपत्ति के MultiBindingसाथ एक संयुक्त का उपयोग कर सकते StringFormatहैं। उपयोग निम्न सदृश होगा:

<TextBlock>
    <TextBlock.Text>    
        <MultiBinding StringFormat="{}{0} + {1}">
            <Binding Path="Name" />
            <Binding Path="ID" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

देते हुए Nameके एक मूल्य Fooऔर IDके एक मूल्य 1, TextBlock में अपने उत्पादन तो होगा Foo + 1

Note: यह केवल .NET 3.5 SP1 और 3.0 SP2 या बाद के संस्करण में समर्थित है।


5
@Preet - मैं वास्तव में निश्चित नहीं हूं यदि इस मामले में '{}' आवश्यक है, तो मैंने इसे शामिल किया क्योंकि यह MSDN नमूने पर उपयोग किया गया था। हालाँकि, XAML पार्सर के लिए बाइंडिंग मार्कअप एक्सटेंशन के साथ भ्रम से बचने के लिए इसे भागने के क्रम के रूप में आवश्यक है।
रिचर्ड मैकगायर

2
इसका एक पक्ष-प्रभाव है। यदि आप इस पद्धति का उपयोग किसी DataGridछँटाई वाले व्यवहार की तरह करते हैं तो दुर्भाग्य से काम नहीं करता है। अपने मॉडल में रीड-ओनली प्रॉपर्टी बनाने के लिए उपयुक्त स्ट्रिंग फॉर्मेट के साथ बाँधने के लिए उपयुक्त समाधान होगा। कहने की जरूरत नहीं है, यह एक छोटा सा तरीका है कि जल्दी से थोड़ा वर्बोज़ को प्रारूपित करें।
ब्रेट रयान

34
आपको केवल {} की आवश्यकता है जब प्रारूप स्ट्रिंग पैरामीटर {0} से शुरू होता है, तो यह आवश्यक नहीं है कि प्रारूप स्ट्रिंग पाठ से शुरू होता है। उदा: "{} {0} + {1}" "पृष्ठ {0} का {1}"
डाकिएथ

इसने WPF प्रोजेक्ट पर काम नहीं किया। नेट 4.0 विज़ुअल स्टूडियो 2017।
सोरुष

@ पैट्रिक के समाधान ने मेरे लिए काम किया। मुझे यह काम करने के लिए नहीं मिला। मुझे यह त्रुटि मिलीXamlParseException: A 'Binding' cannot be set on the 'Path' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
टायसन विलियम्स

127

मुझे पता है कि यह देर से आने वाला तरीका है, लेकिन मुझे लगा कि मैं इसे करने का एक और तरीका जोड़ूंगा।

आप इस तथ्य का लाभ उठा सकते हैं कि टेक्स्ट संपत्ति " रन एस" का उपयोग करके सेट की जा सकती है , इसलिए आप प्रत्येक के लिए एक रन का उपयोग करके कई बाइंडिंग सेट कर सकते हैं। यह उपयोगी है यदि आपके पास मल्टीबाइंडिंग तक पहुँच नहीं है (जो कि विंडोज फोन के लिए विकसित होने पर मुझे नहीं मिली)

<TextBlock>
  <Run Text="Name = "/>
  <Run Text="{Binding Name}"/>
  <Run Text=", Id ="/>
  <Run Text="{Binding Id}"/>
</TextBlock>

4
यह एक बहुत ही आसान तरीका है जिसका उपयोग करते समय कई स्ट्रिंग्स के लिए बाध्य किया जाता है जो कि एक डायनेमिकResource के रूप में दिया जाता है क्योंकि आप इसके लिए StringFormat के साथ मल्टीबाइंडिंग का उपयोग नहीं कर सकते हैं।
23

मैंने बस यही कोशिश की। यह काम करता है, हालांकि हर तत्व (यहां तक ​​कि ज्यामिति) जो खींचा जाता है (एक ताज़ा पर) अब किसी कारण के लिए प्रत्येक टिक को झपकाता है। दूसरी विधि को आजमाने जा रहे हैं।
लोगान क्लेंनर

6
यह मुश्किल हो सकता है यदि पाठ को स्थानीय बनाना है क्योंकि आदेश हार्डकोड है।
ब्लूएम

1
इस दृष्टिकोण का एक और उपयोग प्रत्येक बंधन के अनुसार अलग-अलग शैली लागू कर रहा है
हामिद नईमी

2019 के लिए सबसे अच्छा जवाब
फैबियो बीसी सूजा

23

यदि ये सिर्फ टेक्स्टब्लॉक (और इस तरह एक तरह से बाध्यकारी) होने जा रहे हैं, और आप केवल मूल्यों को संक्षिप्त करना चाहते हैं, तो बस दो टेक्स्टब्लॉक बाँधें और उन्हें एक क्षैतिज स्टैकपैनल में डालें।

    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Name}"/>
        <TextBlock Text="{Binding ID}"/>
    </StackPanel>

वह पाठ प्रदर्शित करेगा (जो सभी टेक्स्टब्लॉक करते हैं) बिना किसी और कोडिंग के। आप उन्हें सही दिखने के लिए उन पर एक छोटा सा मार्जिन रख सकते हैं।


11

एक ValueConverter का उपयोग करें

[ValueConversion(typeof(string), typeof(String))]
public class MyConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format("{0}:{1}", (string) value, (string) parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {

        return DependencyProperty.UnsetValue;
    }
}

और मार्कअप में

<src:MyConverter x:Key="MyConverter"/>

। । ।

<TextBlock Text="{Binding Name, Converter={StaticResource MyConverter Parameter=ID}}" />

हां - यह 6 साल पहले लिखा गया था, और आप कनवर्टर के पहले तर्क के रूप में "नाम" को बाध्य कर रहे हैं (कोड में मूल्य), और दूसरे तर्क के रूप में आईडी (प्रश्न से एक स्ट्रिंग)।
प्रीत संघ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.