2010-10-28 13 views
13

का उपयोग कर दृश्य मॉडल में बदल दिया गया है। हमने कैलिबर्न का उपयोग किया है। एक नई सिल्वरलाइट परियोजना पर मिक्रो और महान काम करने वाले हर चीज। अंतर्निर्मित सम्मेलन बाध्य बटन दृश्यों को देखने के लिए घटनाओं पर क्लिक करें मॉडल, लेकिन मुझे यकीन नहीं है कि चयन को संभालने का सबसे अच्छा तरीका डेटाग्रिड्स और कम्बोबॉक्स पर चेंज किया गया ईवेंट है।बाध्यकारी चयन Caliburn.Micro

फिलहाल, मैं चयनित आइटम पर बाध्यकारी हूं और कस्टम तर्क कह रहा हूं, लेकिन मुझे लगता है कि यह एक कोड गंध का थोड़ा सा है और मुझे संपत्ति की सेटिंग और चयनित चेंज इवेंट को अलग करना चाहिए। लेकिन अगर मैं इन्हें अलग करता हूं, तो मैं चयन को बाध्य कैसे कर सकता हूं घटना को मेरे दृश्य में बदल सकता है मॉडल, आदेशों से? या एक EventTrigger? या नीचे कोड स्वीकार्य है? यह एक छोटा सा परिवर्तन है लेकिन मैं हर जगह यह तर्क करता हूं।

private Foo _selectedFoo; 
public Foo SelectedFoo 
{ 
    get 
    { 
     return _Foo; 
    } 
    set 
    { 
     if (_Foo != null && _Foo.Equals(value)) return; 
     _Foo = value; 
     NotifyOfPropertyChange("SelectedFoo"); 
     NotifyOfPropertyChange("CanRemove"); 
     LoadRelatedBars(); 
    } 
} 

उत्तर

16

मैं नियमित रूप से इस तकनीक का उपयोग करता हूं और मुझे इसके साथ बहुत सहज महसूस होता है।
मुझे पूरी तरह से ठीक लगता है कि वीएम नए राज्य को स्थापित करने के लिए बाहरी अभिनेता (जो आकस्मिक रूप से दृश्य है, लेकिन एक और घटक भी हो सकता है) की आवश्यकता के बिना अपने राज्य परिवर्तन में प्रतिक्रिया करता है, फिर वीएम को संकेत मिलता है कि राज्य बदल गया है।

तुम सच में, हालांकि, आप वी एम में किसी कार्रवाई से देखें में एक घटना हुक करने Message.Attach जुड़ी संपत्ति का उपयोग कर सकते करना चाहते हैं:

cal:Message.Attach="[Event SelectionChanged] = [OnSelectionChangedAction]" 

(यह भी देख http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions)

-1

यहां एमवीवीएम और कैलिबर्न के लिए एक नमूना है। माइक्रो का उपयोग कर। SelectionChanged जैसे कुछ कार्यों को एक ईवेंट तर्क स्पष्ट करना चाहिए, इसलिए आपको इसे कैलिब्रर्न ईवेंट एक्शन पार्ट में सेट करना चाहिए। अक्सर पहली तर्क यह $ (वास्तविक ui तत्व जिस पर कार्रवाई संलग्न है) पास कर रही है। और आप पंक्ति के लिए हैंडलर को डेटाकॉन्टेक्स्ट में प्राप्त करते हैं लेकिन ग्रिड तक पहुंचने के लिए आपको $ स्रोत को पास करना चाहिए, जैसा कि पहला तर्क ($ स्रोत - वास्तविक फ्रेमवर्क एलिमेंट है जो एक्शन मैसेज भेजने के लिए ट्रिगर किया गया है)। मैनुअल Caliburn manual के अनुसार।

XAML

cal:Message.Attach="[Event SelectionChanged]=[Action DataGrid_JobTypesSelectionChanged($source,$eventArgs)];" 

कोड:

public void DataGrid_JobTypesSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var grid = sender as DataGrid; 
     JobTypesSelectedCollection = grid.SelectedItems.Cast<JobComplexModel>().ToList(); 
    } 
+0

में आपका स्वागत है अतः करने के लिए! ओपी के लिए कोड के कारणों की व्याख्या करें। न केवल "कैसे" लेकिन "क्यों"। – garfbradaz

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