StringFormat के साथ WPF बाइंडिंग टूलटिप्स पर काम नहीं करता है


87

निम्नलिखित कोड में एक सरल बाइंडिंग है जो टेक्स्ट बॉक्स के टेक्स्ट को MyTextBlock नाम से टेक्स्टबॉक्स के टेक्स्ट और टूलटिप प्रॉपर्टी में बांधता है, ठीक उसी बाइंडिंग नोटेशन का उपयोग करके:

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox    Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}"
             ToolTip="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}" />
</StackPanel>

बाइंडिंग .NET 3.5 SP1 के साथ शुरू की गई StringFormat संपत्ति का भी उपयोग करती है जो उपरोक्त पाठ संपत्ति के लिए ठीक काम कर रही है लेकिन टूलटिप के लिए टूटी हुई प्रतीत होती है। अपेक्षित परिणाम "यह है: फू बार" लेकिन जब आप टेक्स्टबॉक्स पर होवर करते हैं, तो टूलटिप केवल बाध्यकारी मूल्य दिखाता है, न कि स्ट्रिंग स्वरूपित मूल्य। कोई विचार?


3
मैं काम करने के लिए नीचे दिए गए समाधानों में से किसी को भी प्राप्त करने में सक्षम नहीं था, लेकिन इस एक ने किया: stackoverflow.com/questions/4498649/…
17 की 26

जवाबों:


156

WPF में टूलटिप्स में केवल टेक्स्ट ही नहीं, कुछ भी हो सकता है, इसलिए वे उस समय के लिए एक ContentStringFormat संपत्ति प्रदान करते हैं, जब आप केवल टेक्स्ट चाहते हैं। जहाँ तक मुझे पता है आपको विस्तारित सिंटैक्स का उपयोग करना होगा:

<TextBox ...>
  <TextBox.ToolTip>
    <ToolTip 
      Content="{Binding ElementName=myTextBlock,Path=Text}"
      ContentStringFormat="{}It is: {0}"
      />
  </TextBox.ToolTip>
</TextBox>

मैं उस तरह की नेस्टेड प्रॉपर्टी से ElementName सिंटैक्स का उपयोग करके बाइंडिंग की वैधता के बारे में 100% निश्चित नहीं हूं, लेकिन ContentStringFormat प्रॉपर्टी वह है जो आप खोज रहे हैं।


1
मैं देखता हूं, मुझे लगा कि टूलटिप, विंडोज फॉर्म की तरह ही एक साधारण स्ट्रिंग है। और हां, इस मामले में ElementName सिंटैक्स बाहरी तत्व तक नहीं पहुंच सकता है।
पति

9
ध्यान दें कि {} की आवश्यकता तभी होती है जब आप स्ट्रिंग की शुरुआत में {0} को रखते हैं, इसलिए आपको इसे अन्य xaml मार्कअप से अलग करने की आवश्यकता होती है।
शिमी वेइटहैंडलर

5
मन = उड़ा। मैं सिर्फ यह मारा और "waaaat?"

2
यह वास्तव में मुझे दिखावा करता है कि जब कोई कनवर्टर निर्दिष्ट नहीं होता है तो स्ट्रिंगफॉर्म सिर्फ 'काम' नहीं करता है। मुझे अपना खुद का स्ट्रिंगफॉर्मैटॉन्सर लिखना था। एमएस ने गेंद को फिर से
गिराया

3
StringFormatTargetTypeस्ट्रिंग के प्रकार होने पर ही लागू किया जाएगा । ToolTipसामग्री प्रकार की है object
जोहान्स वंजेक

22

यह एक बग हो सकता है। जब आप टूलटिप के लिए छोटे वाक्यविन्यास का उपयोग करते हैं:

<TextBox ToolTip="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}" />

StringFormat को अनदेखा किया जाता है, लेकिन जब आप विस्तारित सिंटैक्स का उपयोग करते हैं:

<TextBox Text="text">
   <TextBox.ToolTip>
      <TextBlock Text="{Binding WhatEverYouWant StringFormat='It is: \{0\}'}"/>
   </TextBox.ToolTip>
</TextBox>

यह उम्मीद के मुताबिक काम करता है।


सबसे सटीक जवाब .. धन्यवाद!
अमीर महदी नासिरी

5

जैसा कि मैट ने कहा कि टूलटिप आपके अंदर कुछ भी शामिल कर सकता है ताकि आप अपने टूलटिप के अंदर एक टेक्स्टबॉक्स को जोड़ सकें।

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}">
        <TextBox.ToolTip>
            <TextBlock>
                <TextBlock.Text>
                    <Binding ElementName=MyTextBlock Path="Text" StringFormat="It is: {0}" />
                </TextBlock.Text>
            </TextBlock>
        </TextBox.ToolTip>
    </TextBox>
</StackPanel>

यहां तक ​​कि आप टूलटिप के अंदर एक ग्रिड को स्टैक कर सकते हैं और यदि आप चाहें तो अपने टेक्स्ट को लेआउट कर सकते हैं।


3

आपका कोड इस प्रकार छोटा हो सकता है:

<TextBlock ToolTip="{Binding PrideLands.YearsTillSimbaReturns,
    Converter={StaticResource convStringFormat},
    ConverterParameter='Rejoice! Just {0} years left!'}" Text="Hakuna Matata"/>

हम इस तथ्य का उपयोग करेंगे कि कन्वर्टर्स को कभी भी नजरअंदाज नहीं किया जाता है, स्ट्रिंगफार्मेट के विपरीत।

इसे StringFormatConverter.cs में डालें :

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace TLKiaWOL
{
    [ValueConversion (typeof(object), typeof(string))]
    public class StringFormatConverter : IValueConverter
    {
        public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (ReferenceEquals(value, DependencyProperty.UnsetValue))
                return DependencyProperty.UnsetValue;
            return string.Format(culture, (string)parameter, value);
        }

        public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
}

अपने में डाल ResourceDictionary.xaml :

<conv:StringFormatConverter x:Key="convStringFormat"/>

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

0

इस स्थिति में, आप सापेक्ष बंधन का उपयोग कर सकते हैं:

<StackPanel>
    <TextBlock x:Name="MyTextBlock">Foo Bar</TextBlock>
    <TextBox Text="{Binding ElementName=MyTextBlock, Path=Text, StringFormat='It is: \{0\}'}"
             ToolTip="{Binding Text, RelativeSource={RelativeSource Self}}" />
</StackPanel>

-7

निम्नलिखित एक चिंताजनक समाधान है, लेकिन यह काम करता है।

<StackPanel>
  <TextBox Text="{Binding Path=., StringFormat='The answer is: {0}'}">
    <TextBox.DataContext>
      <sys:Int32>42</sys:Int32>
    </TextBox.DataContext>
    <TextBox.ToolTip>
      <ToolTip Content="{Binding}" ContentStringFormat="{}The answer is: {0}" />
    </TextBox.ToolTip>
  </TextBox>
</StackPanel>

मैं बहुत सरल वाक्यविन्यास पसंद करूंगा, मेरे मूल प्रश्न में से कुछ।


1
@ शमी: "बेहतर" देखने वाले की नजर में है, और अपने स्वयं के प्रश्न को स्वीकार किए गए उत्तर को चिह्नित करना ठीक है
एंडोमर

1
@ शमी इससे भी बदतर, उनके जवाब में एक '42' मजाक शामिल है।

6
@Andomar, बेहतर यही है कि लोग अपने वोटों से तय करें, यहां भी कण-कण, यह लगभग एक ही जवाब है। ppl को आपके प्रश्नों का उत्तर देना और फिर उनके उत्तरों को कॉपी करना और इसके लिए प्रतिष्ठा हासिल करना पूरी तरह से गलत एटीट्यूड है।
शिमी वेइटहैंडलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.