2009-04-28 21 views
20

से देखने पर ईवेंट को सक्रिय करने के लिए अपने WPF आवेदन में जिस तरह से मैं 2 विंडोज (दोनों विंडोज के लिए अपने स्वयं ViewModel है) है:WPF MVVM सही ViewModel

  1. आवेदन की मुख्य विंडो कि शब्दों के समूह के साथ सूची प्रदर्शित करता है (बाध्य MainViewModel करने के लिए)

  2. संवाद खिड़की उपयोगकर्ताओं की सूची (AddWordViewModel करने के लिए बाध्य) के लिए नए आइटम जोड़ने की अनुमति देता है कि

MainViewModel ली के लेख संपत्ति है सेंट (यह संग्रह सेवा कक्षाओं में से एक द्वारा पॉप्युलेट किया गया है) मुख्य विंडो की सूची बॉक्स

AddWordViewModel में SaveWordCommand है जो Word Dialog के Save बटन को जोड़ने के लिए बाध्य है। यह काम उपयोगकर्ता द्वारा दर्ज टेक्स्ट लेना और सेवा कक्षा में भेजना है।

उपयोगकर्ता सहेजें बटन पर क्लिक करने के बाद मुझे सेवा से लेख पुनः लोड करने के लिए MainViewModel को सूचित करने की आवश्यकता है।

मेरा विचार AddWordViewModel

से MainViewModel में सार्वजनिक आदेश को बेनकाब और इसे निष्पादित करने के लिए था

इसे लागू करने के लिए सही तरीका क्या है?

धन्यवाद!

उत्तर

18

Event Aggregators इस प्रकार की समस्या को हल करने का एक अच्छा तरीका है। असल में एक केंद्रीकृत वर्ग है (सादगी के लिए चलिए कहते हैं कि यह सिंगलटन है और एंटी-सिंगलटन लोगों के संभावित क्रोध का सामना करना पड़ता है) जो एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट को स्थानांतरित करने के लिए ज़िम्मेदार है। अपने वर्ग के नाम के साथ उपयोग लग सकता है जैसे:

public class MainViewModel 
{ 
    public MainViewModel() 
    { 
     WordAddedEvent event = EventAggregator.Instance.GetEvent<WordAddedEvent>(); 
     event.Subscribe(WordAdded); 
    } 

    protected virtual void WordAdded(object sender WordAddedEventArgs e) 
    { 
     // handle event 
    } 
} 

public class AddWordViewModel 
{  
    //From the command 
    public void ExecuteAddWord(string word) 
    { 
     WordAddedEvent event = EventAggregator.Instance.GetEvent<WordAddedEvent>(); 
     event.Publish(this, new WordAddedEventArgs(word)); 
    } 
} 

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


आप सिंगलटन से बचना चाहते हैं (और परीक्षण प्रयोजनों के लिए मैं आपको बस इतना सुझाव है) तो यह निर्भरता इंजेक्शन में देख लायक हो सकता है, हालांकि यह है कि वास्तव में एक पूरी अन्य मुद्दा है।


ठीक है, अंतिम विचार। मैं आपके प्रश्न को दोबारा पढ़ने से देखता हूं कि आपके पास पहले से ही कुछ प्रकार की वर्ड सर्विस क्लास है जो वर्ड ऑब्जेक्ट्स को पुनर्प्राप्त करने और संग्रहण करने के लिए संभालती है। ऐसा कोई कारण नहीं है कि जब नया व्यू जोड़ा जाता है तो ईवेंट को बढ़ाने के लिए सेवा ज़िम्मेदार नहीं हो सकती है क्योंकि दोनों व्यूमोडल्स पहले से ही इसके साथ हैं। हालांकि मैं अभी भी सुझाव देंगे EventAggregator अधिक लचीला और एक बेहतर समाधान है, लेकिन YAGNI यहां आवेदन कर सकते हैं

public class WordService 
{ 
    public event EventHandler<WordAddedEventArgs> WordAdded; 

    public List<string> GetAllWords() 
    { 
     //return words 
    } 

    public void SaveWord(string word) 
    { 
     //Save word 
     if (WordAdded != null) WordAdded(this, new WordAddedEventArgs(word)); 
     //Note that this way you lose the reference to where the word really came from 
     //probably doesn't matter, but might 
    } 
} 

public class MainViewModel 
{ 
    public MainViewModel() 
    { 
     //Add eventhandler to the services WordAdded event 
    } 
} 

क्या आप यद्यपि कर एक कमांड को फोन करके ViewModels है कि आप पैदा हो जाएगी के बीच युग्मन पेश कर रहा है से बचना चाहते हैं एक व्यूमोडेल पर दूसरे के साथ, यह एप्लिकेशन को विस्तारित करने के लिए आपके विकल्पों को गंभीर रूप से सीमित कर देगा (क्या होगा यदि कोई दूसरा व्यूमोडेल नए शब्दों में दिलचस्पी लेता है, तो क्या यह अब एडवॉर्ड व्यू मॉडेल की ज़िम्मेदारी भी है?)

+0

बहुत विस्तृत के लिए धन्यवाद जवाब। इसमें खोदना होगा :) बहुत मज़ा आता है :) –

+0

मैं अपने एमवीवीएम कार्यान्वयन के लिए एक बड़े ऑब्जेक्ट ग्राफ के साथ पूर्ण बोर ओओ चला गया।लाइन के नीचे 2 साल और संरचनात्मक परिवर्तन करना काफी कठिन है। काश मैं एग्रीगेटर/मध्यस्थ पैटर्न के लिए गया हूं क्योंकि लचीलापन भारी है। सावधान: मेमोरी लीक। सुनिश्चित करें कि आपका एग्रीगेटर कमजोर संदर्भों का उपयोग करता है। – Gusdor

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