2008-09-11 13 views
9

मैं अपने WPF UI के लिए M-V-VM पैटर्न का पालन कर रहा हूं। मैं टेक्स्टबॉक्स की टेक्स्ट चेंजेड घटना में एक कमांड को अपने कमांड मॉडल में एक कमांड को हुक करना चाहता हूं। इस कार्य को पूरा करने का एकमात्र तरीका मैं टेक्स्टबॉक्स नियंत्रण से प्राप्त करना चाहता हूं, और आईसीओएमएंडसोर्स को लागू करना चाहता हूं। इसके बाद मैं टेक्स्ट चेंजेड इवेंट से निकाल दिया जाने वाला आदेश निर्देशित कर सकता हूं। यह ऐसा कुछ लगता है जो बहुत आसान प्रतीत होता है।टेक्स्टबॉक्स .extChanged और ICommandSource

वहाँ एक आसान तरीका (पाठ बॉक्स उपवर्गीकरण और लागू करने ICommandSource से) मेरी ViewModel वर्ग के लिए TextChanged घटना ऊपर हुक करने है?

उत्तर

18

सबसे पहले, आप निश्चित रूप से दो तरह से डेटा आपके viewmodel के लिए बाध्य, PropertyChanged के UpdateSourceTrigger साथ विचार किया है? इस तरह से जिस संपत्ति को आप बांधते हैं उसका संपत्ति सेटर हर बार टेक्स्ट बदल जाता है?

यदि यह पर्याप्त नहीं है, तो मैं संलग्न व्यवहार का उपयोग करके इस समस्या से निपटूंगा। जूलियन डोमिंग्वेज़ के ब्लॉग पर आपको article मिलेगा सिल्वरलाइट में कुछ ऐसा ही करने के तरीके के बारे में, जिसे WPF के लिए आसानी से अनुकूलन किया जाना चाहिए।

असल में, एक स्थैतिक वर्ग (जिसे टेक्स्टबॉक्स बॉक्सहाउस कहते हैं) में आप एक संलग्न संपत्ति को परिभाषित करते हैं (शायद) टेक्स्ट चेंजड कॉमांड टाइप आईसीओएमएंड। उस संपत्ति के लिए एक ऑनप्रॉपर्टी चेंज हैंडलर को हुक अप करें, और हैंडलर के भीतर, जांचें कि संपत्ति टेक्स्टबॉक्स पर सेट की जा रही है; यदि ऐसा है, तो टेक्स्टबॉक्स पर टेक्स्ट चेंज किए गए ईवेंट में एक हैंडलर जोड़ें जो संपत्ति में निर्दिष्ट कमांड को कॉल करेगा।

फिर, अपने viewmodel माना आपके दृश्य के DataContext करने के लिए आवंटित किया गया है, आप इसे पसंद का प्रयोग करेंगे:

<TextBox 
    x:Name="MyTextBox" 
    TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" /> 
+1

धन्यवाद सैम - कभी कभी मैं सरल विकल्पों को देखने के असफल; जो इस मामले में टेक्स्टबॉक्स को मेरे व्यूमोडेल में एक स्ट्रिंग प्रॉपर्टी से बंधे हुए थे। –

+0

मुझे नहीं लगता कि संपत्ति के सेटटर को तर्क जोड़ना काम करेगा। डब्ल्यूपीएफ एक्सएएमएल प्रोसेसर संपत्ति आवरण के माध्यम से सीधे निर्भरता संपत्ति का उपयोग करता है। इसका मतलब यह है कि यूआई अपडेट होने पर सेटर कभी नहीं बुलाया जाएगा। (स्रोत: http://msdn.microsoft.com/en-us/library/bb613563.aspx) – Greg

+2

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

3

क्या आप केवल टेक्स्ट चेंज किए गए ईवेंट को संभाल नहीं सकते हैं और वहां से आदेश निष्पादित कर सकते हैं?

private void _textBox_TextChanged(object sender, EventArgs e) 
{ 
    MyCommand.Execute(null); 
} 

विकल्प के रूप में आप कहते हैं, एक TextBox कि एक कमांड स्रोत के रूप में कार्य करता है बनाने के लिए है, लेकिन यह overkill की तरह लग जब तक कि यह कुछ आप साझा करने की योजना बना रहे और कई जगहों पर लाभ है करता है।

8

बंधन और आदेश विधि का उपयोग करने के लिए सही बात नहीं हो सकता है घटना का उपयोग करना। यह आदेश वास्तव में क्या करेगा?

आप अपने वीएम में एक स्ट्रिंग फ़ील्ड में डाटाबेसिंग का उपयोग करने पर विचार करना चाहेंगे। इस तरह आप UI की देखभाल करने के बजाय वहां से कमांड या फ़ंक्शन पर कॉल कर सकते हैं।

<TextBox Text="{Binding WorldName}"/> 
.... 
public string WorldName 
{ 
    get 
    { 
     return WorldData.Name; 
    } 
    set 
    { 
     WorldData.Name = value; 
     OnPropertyChanged("WorldName"); 
     // CallYourCustomFunctionHere(); 
    } 
} 
+0

धन्यवाद निडोनोकू। आपका उत्तर भी सही है, लेकिन मैंने सैम की प्रतिक्रिया को जवाब के रूप में चिह्नित किया क्योंकि उसने आपके सामने थोड़ा जवाब दिया था। फिर भी धन्यवाद! –

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