2012-09-05 5 views
5

एक WPF अनुप्रयोग में, मैं कीबोर्ड शॉर्टकट को कस्टमाइज़ करने के लिए एक सेटिंग विंडो बना रहा हूं।मैं WPB में बाध्यकारी खोने के बिना TextBox.Text को कैसे बदलूं?

टेक्स्टबॉक्स में, मैं कीडाउन घटना को संभालता हूं और कुंजी ईवेंट को मानव पठनीय रूप में परिवर्तित करता हूं (और वह रूप जिसमें मैं अपना डेटा रखना चाहता हूं)।

पाठ बॉक्स इस

<TextBox Text="{Binding ShortCutText, Mode=TwoWay}"/> 

की तरह घोषित किया जाता है और ईवेंट हैंडलर में, मैं दोनों

(sender as TextBox).Text = "..."; 

और

(sender as TextBox).Clear(); 
(sender as TextBox).AppendText("..."); 

इन दोनों मामलों में, उपयोग करने की कोशिश व्यूमोडेल पर वापस बाध्यकारी काम नहीं करता है, व्यूमोडेल में अभी भी पुराना डेटा है और अपडेट नहीं होता है। दूसरी दिशा में बाध्यकारी (व्यूमोडेल से टेक्स्टबॉक्स तक) ठीक काम करता है।

क्या कोई तरीका है कि मैं टेक्स्टबॉक्स संपादित कर सकता हूं। बाध्यकारी का उपयोग किए बिना कोड से आगे? या मेरी प्रक्रिया में कहीं और त्रुटि है?

+3

आदर्श रूप से आपको यह मॉडल अपने मॉडल में अपडेट करना चाहिए जो आपके द्वारा एमवीवीएम का उपयोग कर टेक्स्टबॉक्स में परिवर्तनों को स्वचालित रूप से प्रतिबिंबित करेगा। – Deepesh

+1

अपने बाध्यकारी –

+0

पर 'अपडेटसोर्स ट्रिगर = प्रॉपर्टी चेंज' जोड़ने का प्रयास करें, मुझे पता है कि यह अब तक एक पुराना सवाल है, लेकिन एक चीज जो लोग यहां अनदेखा कर रहे हैं वह यह है कि यदि आपके पास नियंत्रण की संपत्ति किसी अन्य नियंत्रण से जुड़ी है (चेक बॉक्स की एक सूची कहें जो माता-पिता चेकबॉक्स द्वारा चेक किए गए या अनचेक किए गए हैं)। यहां आपकी सहायता के लिए वीएम में कुछ भी नहीं हो सकता है। –

उत्तर

8
var box = sender as TextBox; 
// Change your box text.. 

box.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

यह आपके बाध्यकारी को अद्यतन करने के लिए मजबूर होना चाहिए।

+0

UpdateTarget() का उपयोग करने के साथ, यह वास्तव में कोई अपडेट नहीं करता है, यहां तक ​​कि टेक्स्टबॉक्स पुराने मान को भी रखता है। –

+0

कुछ जवाबों के लिए अभी भी कुछ सोच की आवश्यकता है .. देखकर आपने उसी कोड का उपयोग किया था, सिवाय इसके कि मैंने पाठ को समायोजित नहीं किया .. मुझे लगता है कि यह सही जवाब है? – KyorCode

+0

मैंने आपको +1 दिया क्योंकि आप अकेले हैं जिन्होंने मदद की। –

3

टेक्स्ट प्रॉपर्टी को न बदलें - जो आप बाध्यकारी हैं उसे बदलें।

private static void SetText(TextBox textBox, string text) 
    { 
     textBox.Clear(); 
     textBox.AppendText(text); 
     textBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
    } 
+0

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

+0

यह नहीं होना चाहिए। टेक्स्टबॉक्स का संदर्भ न दें। जो भी तर्क है पाठ को अपडेट करना होगा, इसे टेक्स्टबॉक्स के बारे में नहीं पता होना चाहिए। –

+0

गंभीरता से? इसका एक "टेक्स्टबॉक्स इनपुट (ऑब्जेक्ट प्रेषक, कीइवेंट एआरजी ई)" ईवेंट हैंडलर ... –

1

यह चाल किया! कोड में आपको केवल अपने संबंधित मान (शॉर्टकूटटेक्स्ट) को संशोधित करने की आवश्यकता है) इसके अलावा आप IsReadOnly = "True" अपने टेक्स्टबॉक्स की संपत्ति सेट कर सकते हैं।

<TextBox Text="{Binding Path=ShortCutText,Mode=OneWay}" 
     KeyDown="TextBox_KeyDown" IsReadOnly="True"/> 

आप MSDN में वर्णित के रूप INotifyPropertyChanged अपनी कक्षा में इंटरफेस का एहसास होना चाहिए:

http://msdn.microsoft.com/library/system.componentmodel.inotifypropertychanged.aspx

अपने ShortCutText संपत्ति के

संशोधित सेटर (जो करने के लिए अपने पाठ बॉक्स के लिए बाध्य है) :

class MyClass:INotifyPropertyChanged 
{ 
    string shortCutText="Alt+A"; 
    public string ShortCutText 
    { 
     get { return shortCutText; } 
     set 
      { 
        shortCutText=value; 
        NotifyPropertyChanged("ShortCutText"); 
      } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    void NotifyPropertyChanged(string props) 
    { 
     if(PropertyChanged != null) 
      PropertyChanged(this , new PropertyChangedEventArgs(prop)); 
    } 

} 

WPF स्वचालित रूप से PropertyChanged ईवेंट की सदस्यता लेगा। अब इस तरह के उदाहरण के लिए, टेक्स्ट बॉक्स की KeyDown घटना का उपयोग करें,:

private void TextBox_KeyDown(object sender , KeyEventArgs e) 
{ 
    ShortCutText = 
     (e.KeyboardDevice.IsKeyDown(Key.LeftCtrl)? "Ctrl+ " : "") 
     + e.Key.ToString(); 
} 
0

आप सब पर पाठ बॉक्स के मान संशोधित करने की जरूरत डॉन 'टी:

1

मैं इसी तरह के मामले है।

जब मैं बाइंडिंग को खो देता हूं तो यह बाध्यकारी खो देता है।

मैं पहना था: textbox1.Text = String.empty

मैं इस के लिए बदलने के लिए: textbox1.Clear()

और ये मेरे समाधान के लिए बिंदु है

0

आप MVVM का उपयोग कर रहे हैं, तो आप कोड से पाठ बॉक्स का पाठ संपत्ति परिवर्तन नहीं होना चाहिए , दृश्य मॉडल में मान बदलें और पैटर्न दृश्य को सिंक्रनाइज़ करने के लिए अपना काम करेगा।

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