2009-01-05 14 views
9

मैं कई टेक्स्टबॉक्स को अंतर्निहित स्ट्रिंग के परिवर्तनों पर प्रतिक्रिया देना चाहता हूं। इसलिए यदि मैं स्ट्रिंग की सामग्री को बदलना चाहता था, तो वे सभी टेक्स्टबॉक्स उनकी सामग्री भी बदल देंगे।एक स्ट्रिंगबिल्डर उदाहरण के लिए टेक्स्टबॉक्स नियंत्रण कैसे बाध्य करें?

अब, मैं इसके लिए स्ट्रिंग प्रकार का उपयोग नहीं कर सकता क्योंकि यह अपरिवर्तनीय है। तो मैं स्ट्रिंगबिल्डर के साथ गया। लेकिन टेक्स्टबॉक्स ऑब्जेक्ट की टेक्स्ट प्रॉपर्टी केवल स्ट्रिंग लेती है।

क्या स्ट्रिंगबिल्डर ऑब्जेक्ट को टेक्स्टबॉक्स की टेक्स्ट प्रॉपर्टी पर "बाध्य" करने का कोई आसान तरीका है?

बहुत धन्यवाद!

पीएस: टेक्स्टबॉक्स वर्तमान में WPF है। लेकिन मैं मोनो के कारण विंडोज फॉर्म पर स्विच कर सकता हूं।

+0

विनफॉर्म या डब्ल्यूपीएफ? –

+0

पीएस: टेक्स्टबॉक्स वर्तमान में डब्ल्यूपीएफ है। लेकिन मैं मोनो के कारण विंडोज फॉर्म पर स्विच कर सकता हूं। – user51710

उत्तर

7

आप हमेशा ऐसी संपत्ति का पर्दाफाश कर सकते हैं जो गेटर स्ट्रिंगबिल्डर के ToString() को लौटाता है। तब फॉर्म इस संपत्ति से जुड़ सकता है।

private StringBuilder _myStringBuilder; 

public string MyText 
{ 
    get { return _myStringBuilder.ToString(); } 
} 
+0

उत्तर रे के लिए धन्यवाद। लेकिन मुझे अभी भी टेक्स्टबॉक्स में मैन्युअल रूप से MyText असाइन करना होगा। आगे, क्या मैं नहीं? जो मैं खोज रहा हूं वह एक ऐसा निर्माण है जिसमें सभी प्रतिभागी एक ही स्मृति स्थान साझा करते हैं। – user51710

+1

यदि आप WPF का उपयोग कर रहे हैं, तो टेक्स्टबॉक्स इस <टेक्स्टबॉक्स टेक्स्ट = "{बाध्यकारी पथ = MyText}" /> जैसा दिखता है और बाध्यकारी आपके लिए इसका ख्याल रखेगा। –

+0

यदि टेक्स्टबॉक्स संपत्ति से बंधे हैं उपरोक्त वाक्यविन्यास के माध्यम से, डब्ल्यूपीएफ आपके लिए सभी बाध्यकारी संभाल लेगा। जब तक आप इंटिफाइप्रोपर्टी चंग्ड ("माईटेक्स्ट) को इंगित करने के लिए स्ट्रिंगबिल्डर में किसी भी बदलाव की पूर्ति करते हैं, तो सभी अच्छी तरह से होंगे। –

1

आप पाठ बॉक्स का उत्तराधिकारी हो सकते हैं और पाठ प्रॉपर्टी को पुनर्प्राप्त करने और लिखने के लिए टेक्स्ट प्रॉपर्टी को ओवरराइड कर सकते हैं।

+0

अंतर्निहित स्ट्रिंगबिल्डर में परिवर्तन के मामले में मुझे अभी भी सूचनाएं जारी करना और संभालना होगा, है ना? – user51710

-5

आप एक स्ट्रिंग संपत्ति को किसी पाठ बॉक्स का पाठ संपत्ति बाध्य कर सकते हैं ... स्ट्रिंग ऑब्जेक्ट अपरिवर्तनीय है, लेकिन प्रकार स्ट्रिंग के एक चर पूरी तरह से परिवर्तनशील है ...

string mutable = "I can be changed"; 
mutable = "see?"; 

आप होगा हालांकि, किसी ऑब्जेक्ट में इसे लपेटने की आवश्यकता है जो INotifyProperty लागू करता है, हालांकि।

+3

एक स्ट्रिंग ऑब्जेक्ट म्यूटेबल नहीं है। एक स्ट्रिंग को संशोधित करते समय जैसे आपने अभी किया है, वास्तव में क्या होता है एक नई स्ट्रिंग बनाई जाती है। –

+0

@ रे: मैं बस इतना कहने वाला था :) – CMS

+0

रे के लिए +1। स्ट्रिंग सबसे निश्चित रूप से अपरिवर्तनीय है। प्रत्येक स्ट्रिंग/स्ट्रिंग असाइनमेंट स्मृति में नई जगह आवंटित करता है। – Kon

0

बस डालें, नहीं। पाठ संपत्ति केवल एक स्ट्रिंग लेता है। तो जो भी स्रोत है, आपको इसे एक स्ट्रिंग में परिवर्तित करना होगा।

आप आसानी से कई बक्सें के लिए एक बार यह स्थापित करने के लिए सक्षम करने के लिए, आप एक वर्ग की संपत्ति है कि हमेशा सभी पाठ बॉक्स मान सेट ...

public string MyString 
{ 
    get 
    { 
    ///... 
    } 
    set 
    { 
    textbox1.Text = value; 
    textbox2.Text = value; 
    //... 
    } 
} 
+0

मुझे लगता है पोस्ट डेटा को बाध्य करने के लिए एक तरीका ढूंढ रहा था और अपडेट करने के लिए टेक्स्टबॉक्स की ठोस सूची नहीं थी। :) –

+0

@ रे, मुझे पता है कि आपका क्या मतलब है, लेकिन वह एक साथ कई नियंत्रण अपडेट करने का एक तरीका ढूंढ रहा है ... और यह एक तरीका है। – Kon

0

मैं एक Add के साथ एक कस्टम कक्षा में StringBuilder लपेट हैं हो सकता है विधि, Text विधि, और OnChanged घटना।

Add विधि को वायरस करें जैसे कि इसे कहने पर यह StringBuilder उदाहरण में टेक्स्ट जोड़ता है और ईवेंट को सक्रिय करता है। फिर जब ईवेंट आग लगती है, तो पर ToString करने के लिए Text विधि का उपयोग करें।

public class StringBuilderWrapper 
{ 
    private StringBuilder _builder = new StringBuilder(); 
    private EventHandler<EventArgs> TextChanged; 
    public void Add(string text) 
    { 
    _builder.Append(text); 
    if (TextChanged != null) 
     TextChanged(this, null); 
    } 
    public string Text 
    { 
    get { return _builder.ToString(); } 
    } 
} 
8

ऐसा लगता है मेरे पिछले जवाब बहुत अच्छी तरह से शब्दों में नहीं किया गया था, के रूप में कई लोगों को बात मैं कर रहा था गलत समझा, तो मैं फिर से खाता लोगों की टिप्पणियों को ध्यान में रखकर की कोशिश करेंगे।

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

डब्ल्यूपीएफ डाटाबेसिंग सिस्टम इस संपत्ति से जुड़ सकता है। यदि यह अधिसूचित किया गया है कि संपत्ति INotifyPropertyChanged के माध्यम से बदलती है, तो यह बाध्यकारी के लक्ष्य को अपडेट करेगी, इस प्रकार कई टेक्स्टबॉक्स एक ही संपत्ति से जुड़ने की अनुमति देगी और बिना किसी अतिरिक्त कोड की आवश्यकता के संपत्ति के अपडेट पर सभी परिवर्तनों को अनुमति देगी।

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

public class MyClass : INotifyPropertyChanged 
{ 
    private string myString; 

    public string MyString 
    { 
     get 
     { return myString; } 
     set 
     { 
      myString = value; 
      OnPropertyChanged("MyString"); 
     } 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { handler(this, new PropertyChangedEventArgs(propertyName)); } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

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

+0

एक अच्छा पूरा उत्तर +1 –

1

यहाँ मैं WPF में पाठ बॉक्स को StringBuilder बाध्य करने के लिए उपयोग करें:

public class BindableStringBuilder : INotifyPropertyChanged 
{ 
    private readonly StringBuilder _builder = new StringBuilder(); 

    private EventHandler<EventArgs> TextChanged; 

    public string Text 
    { 
     get { return _builder.ToString(); } 
    } 

    public int Count 
    { 
     get { return _builder.Length; } 
    } 

    public void Append(string text) 
    { 
     _builder.Append(text); 
     if (TextChanged != null) 
      TextChanged(this, null); 
     RaisePropertyChanged(() => Text); 
    } 

    public void AppendLine(string text) 
    { 
     _builder.AppendLine(text); 
     if (TextChanged != null) 
      TextChanged(this, null); 
     RaisePropertyChanged(() => Text); 
    } 

    public void Clear() 
    { 
     _builder.Clear(); 
     if (TextChanged != null) 
      TextChanged(this, null); 
     RaisePropertyChanged(() => Text); 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

    public void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression) 
    { 
     if (propertyExpression == null) 
     { 
      return; 
     } 

     var handler = PropertyChanged; 

     if (handler != null) 
     { 
      var body = propertyExpression.Body as MemberExpression; 
      if (body != null) 
       handler(this, new PropertyChangedEventArgs(body.Member.Name)); 
     } 
    } 

    #endregion 


} 

ViewModel में:

public BindableStringBuilder ErrorMessages { get; set; } 
ErrorMessages.AppendLine("Missing Image: " + imagePath); 

Xaml में:

<TextBox Text="{Binding ErrorMessages.Text, Mode=OneWay}"/> 

बेशक आप अन्य StringBuilder बेनकाब कर सकते हैं यदि आपको आवश्यकता हो तो विधियां।

संबंधित मुद्दे