TextBlocks के ढेर का उपयोग करने के बजाय तार को समेटें


88

मैं एक WPF ItemControl में ग्राहक वस्तुओं की एक सूची दिखाना चाहता हूं। मैंने इसके लिए एक DataTemplate बनाया है:

    <DataTemplate DataType="{x:Type myNameSpace:Customer}">
        <StackPanel Orientation="Horizontal" Margin="10">
            <CheckBox"></CheckBox>
            <TextBlock Text="{Binding Path=Number}"></TextBlock>
            <TextBlock Text=" - "></TextBlock>
            <TextBlock Text="{Binding Path=Name}"></TextBlock>
        </StackPanel>
    </DataTemplate>

तो जो मैं मूल रूप से चाहता हूं वह एक साधारण सूची (चेकबॉक्स के साथ) है जिसमें NUMBER - NAME शामिल हैं। क्या कोई ऐसा तरीका नहीं है, जिसमें मैं सीधे बाइंडिंग भाग में संख्या और नाम रख सकूं?

जवाबों:


171

StringFormat प्रॉपर्टी है (.NET 3.5 SP1 में), जिसे आप शायद इस्तेमाल कर सकते हैं। और उपयोगी WPF बाइंडिंग चीट शेट यहाँ मिल सकता है । यदि यह मदद नहीं करता है, तो आप अपनी वस्तु के लिए अपने स्वयं के मान मूल्य या कस्टम संपत्ति लिख सकते हैं।

बस जाँच की, आप StringFormat का उपयोग मल्टीबाइंडिंग के साथ कर सकते हैं। आपके मामले में कोड कुछ इस तरह होगा:

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

मुझे अंतरिक्ष के साथ प्रारूप स्ट्रिंग शुरू करना था, अन्यथा विज़ुअल स्टूडियो का निर्माण नहीं होगा, लेकिन मुझे लगता है कि आपको इसके चारों ओर रास्ता मिल जाएगा :)

संपादित करें
StringFormat में अंतरिक्ष {0}को एक वास्तविक बाध्यकारी के रूप में पार्सर से इलाज करने के लिए आवश्यक है । अन्य विकल्प:

<!-- use a space before the first format -->
<MultiBinding StringFormat=" {0} - {1}">

<!-- escape the formats -->
<MultiBinding StringFormat="\{0\} - \{1\}">

<!-- use {} before the first format -->
<MultiBinding StringFormat="{}{0} - {1}">

29
अंतरिक्ष के बजाय आप {} का उपयोग कर सकते हैं, जैसे StringFormat = "{} {0} - {1}"
ब्रायन एंडरसन

6
आप बैकस्लैश के साथ ब्रेसिज़ से भी बच सकते हैं: <MultiBinding StringFormat = "\ {0 \} - \ {1 \}">
hughdbrown

इसके अलावा, समापन टेक्स्टब्लॉक गायब है, इसलिए टिप्पणियों को संक्षेप में प्रस्तुत करने के लिए: <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} {0} - {1}"> <बाइंडिंग पथ = "संख्या" /> <बाइंडिंग पथ = "नाम" /> </ MultiBinding> </TextBlock.Text> </ TextBlock>
TJKjaer

@PiRX अगर मैं 'नंबर' दिखाना चाहता हूं, भले ही 'नाम' खाली हो- मैं ऐसा कैसे करूं?
दासदास

@DasDas दुर्भाग्य से मैं आपके प्रश्न में मदद नहीं कर पाऊंगा क्योंकि मैंने कई वर्षों तक WPF के साथ काम नहीं किया है। यह अजीब है कि आप कितनी तेजी से उन चीजों को भूल जाते हैं जिन्हें आप अब और काम नहीं कर रहे हैं।
PiRX

64

यदि आप एक स्थैतिक पाठ के साथ एक गतिशील मान प्राप्त करना चाहते हैं, तो यह कोशिश करें:

<TextBlock Text="{Binding IndividualSSN, StringFormat= '\{0\} (SSN)'}"/>

प्रदर्शित करता है : २३४-३३४-५५६६ (एसएसएन)


1
TextBlockLeftStyle की सामग्री क्या है?
इसका समय

यह एक कस्टम शैली है जिसे मुझे टेक्स्टब्लॉक को बाईं ओर संरेखित करना है। इसका यहां कोई महत्व नहीं है।
redskull

1
यह एक स्ट्रिंग के साथ एक बंधन को बदलने का सबसे अच्छा समाधान है
Devid

8

निम्न उदाहरण देखें मैंने रन कोड का उपयोग करके अपने कोड में उपयोग किया है:

        <TextBlock x:Name="..." Width="..." Height="..."
            <Run Text="Area="/>
            <Run Text="{Binding ...}"/>
            <Run Text="sq.mm"/>
            <LineBreak/>
            <Run Text="Min Diameter="/>
            <Run Text="{Binding...}"/>
            <LineBreak/>
            <Run Text="Max Diameter="/>
            <Run Text="{Binding...}"/>
        </TextBlock >

3

आप बाइंडेबल रन का भी उपयोग कर सकते हैं। उपयोगी सामान, खासकर यदि कोई कुछ पाठ स्वरूपण (रंग, फ़ॉन्टवेट आदि) जोड़ना चाहता है।

<TextBlock>
   <something:BindableRun BoundText="{Binding Number}"/>
   <Run Text=" - "/>
   <something:BindableRun BoundText="{Binding Name}"/>
</TextBlock>

यहां एक मूल वर्ग दिया गया है:
यहां कुछ अतिरिक्त सुधार किए गए हैं।
और यह सब कोड के एक टुकड़े में है:

public class BindableRun : Run
    {
        public static readonly DependencyProperty BoundTextProperty = DependencyProperty.Register("BoundText", typeof(string), typeof(BindableRun), new PropertyMetadata(new PropertyChangedCallback(BindableRun.onBoundTextChanged)));

        private static void onBoundTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((Run)d).Text = (string)e.NewValue;
        }

        public String BoundText
        {
            get { return (string)GetValue(BoundTextProperty); }
            set { SetValue(BoundTextProperty, value); }
        }

        public BindableRun()
            : base()
        {
            Binding b = new Binding("DataContext");
            b.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(FrameworkElement), 1);
            this.SetBinding(DataContextProperty, b);
        }
    }

1
<रन टेक्स्ट = "{बाइंडिंग ...}" />? क्या आप फायदे बता सकते हैं?
फेलिक्स कील

1
कोई फर्क नहीं; जब यह उत्तर लिखा गया था तो रन ने 10 साल पहले पाठ संपत्ति पर बाइंडिंग का समर्थन नहीं किया था!
josh2112
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.