2011-04-29 19 views
21

मैं सिर्फ कैलिबर्न माइक्रो से शुरू कर रहा हूं। मैं तारों की सूची के साथ एक कॉम्बो बॉक्स रखना चाहता हूं, और जब उपयोगकर्ता कोई आइटम चुनता है, तो मुझे कुछ अधिसूचना विधि चाहिए। यह सरल होना चाहिए, है ना? मैं अधीर हूं, और गुगलिंग के 5 मिनट ने इसे मेरे लिए हल नहीं किया है, इसलिए बचाव के लिए स्टैकर्स!कैलिबर्न माइक्रो में कम्बोबॉक्स चयन कैप्चर कैसे करें?

नोट: मुझे एक उत्तर का पक्ष है जो मुझे दिखाता है कि इसे दृश्य मॉडल में कैसे रखा जाए। जटिल एक्सएएमएल से बचें एमवीवीएम फ्रेमवर्क, आईएमएचओ का पूरा बिंदु है।

+0

एक और नहीं बल्कि सुरुचिपूर्ण समाधान यहाँ का प्रस्ताव है: http://stackoverflow.com/questions/4041233/binding-selectionchanged-to-viewmodel-using-caliburn-micro – buckley

उत्तर

59

Caliburn.Micro ItemsControl (जैसे ComboBox या ListBox) आधारित नियंत्रण जो आवश्यक XAML बनाने में आप कम से कम देखें समर्थन सम्मेलनों में पकाया गया है।

सबसे पहले आपके पास मानक सम्मेलन है जहां नियंत्रण सामग्री नियंत्रण के समान नाम के साथ व्यूमोडेल प्रॉपर्टी से जुड़ी होगी। ItemsControl के मामले में नियंत्रण सामग्री गुण ItemsControl.ItemsSource है। और दूसरा सम्मेलन आप कैलिबर्न के साथ बॉक्स से बाहर निकलते हैं। मिक्रो यह है कि ItemsControl.SelectedItem को एक व्यूमोडेल प्रॉपर्टी में बांधने का प्रयास किया जाएगा जिसमें नियंत्रण का एकवचन नाम है, या तो "सक्रिय", "चयनित" या "वर्तमान" प्रीपेन्ड (कैलिबर्न में ConventionManager देखें। माइक्रो स्रोत)।

मन में यह आप प्राप्त कर सकते है कि आप अपने दृश्य में निम्नलिखित के साथ हैं:

<ComboBox x:Name="Strings"></ComboBox> 

और अपने ViewModel में:

public BindableCollection<string> Strings 
{ 
    get 
    { 
     // silly example of the collection to bind to 
     return new BindableCollection<string>(
         new string[]{ "one", "two", "three"});    
    } 
} 

private string _selectedString; 
public string SelectedString 
{ 
    get { return _selectedString; } 
    set 
    { 
     _selectedString= value; 
     NotifyOfPropertyChange(() => SelectedString); 
     // and do anything else required on selection changed 
    } 
} 

पहले सम्मेलन नियंत्रण नाम को चुनता है ("स्ट्रिंग्स ") और ComboBox.ItemsSource को ViewModel प्रॉपर्टी Strings पर बांधता है। दूसरा सम्मेलन पहले "स्ट्रिंग्स" को "स्ट्रिंग" में एकवचन करता है और ComboBox.SelectedItem को बांधने के लिए "चयनित स्ट्रिंग" संपत्ति प्राप्त करने के लिए "चयनित" तैयार करता है।

+0

यह आईएमओ यहां स्वीकृत उत्तर होना चाहिए। यह एक्सएएमएल में गंदा बाध्यकारी कोड की छापे हो जाता है जो व्यूमोडेल में इवेंट फ़ंक्शन का नाम देता है, और कैलिबर्न पर निर्भर करता है। माइक्रो के इस तरह के सम्मेलनों को चाहिए। श्रीमान को +1 –

+0

मैं सहमत हूं- बहुत स्पष्ट स्पष्टीकरण, धन्यवाद। –

+0

+1 - यह स्पष्ट और संक्षेप में उत्तर है जो मुझे खुश करता है मैं SO पर हूं ... –

12
<ListBox x:Name="Items" ItemsSource="{Binding Path=Items}" cal:Message.Attach="[Event SelectionChanged]=[Action SelectedItemChanged($this.SelectedItem)]"> 
+1

यह एक घटना को संभालने के लिए XAML की बहुत है। मैंने सोचा कि कैलिबर्न का बिंदु उस अव्यवस्था को कम करने के लिए सम्मेलन का उपयोग करना था। –

+0

आप सही थे, इसे बहुत कम xaml के साथ किया जा सकता है;) – Bas

+0

कैल की परिभाषा क्या है? –