2013-01-18 28 views
7

में एक संदेश/सदस्यता तंत्र को कार्यान्वित करना मैं एमवीवीएम पैटर्न के साथ एक WPF अनुप्रयोग प्रोटोटाइप कर रहा हूं। this question के उत्तर के बाद मैंने ModelProviderService सेट किया है जो मॉडल को गुणों के रूप में उजागर करता है। सेवा के उपभोक्ता व्यूमोडेल हैं, यानी वे अपने मॉडल को स्वयं को तुरंत चालू करने के बजाय सेवा से खींचते हैं।सी #

  • एक ViewModel जैसे की संपत्ति परिवर्तन:

    class ModelProviderService { 
    
        private LoginModel loginModel; 
        public LoginModel LoginModel { 
        get { return loginModel; } 
        set { loginModel = value; } 
        } 
    
        private ProjectsModel projectsModel; 
        public ProjectsModel ProjectsModel { 
        get { return projectsModel; } 
        set { projectsModel = value; } 
        } 
    
        public ModelProviderService() { 
        loginModel = new LoginModel(); 
        projectsModel = new ProjectsModel(); 
        }  
    } 
    

    अब, यहाँ क्या हो जाएगा LoginModel संपत्ति। modelService.LoginModel.MyProperty = localLoginModel.MyProperty;

  • सेवा संदेश प्रकाशित करेगा::
  • viewmodel अपनी संपत्ति की स्थापना करके वापस सेवा के लिए मॉडल संपत्ति भेजता है "। अरे, प्रकार LoginModel के अपने मॉडल बस बदल गया"
  • कोई भी अन्य व्यूमोडेल जिसने इस संदेश की सदस्यता ली है, इस बदलते मॉडल को सेवा से खींच देगा।

मैं कैसे लागू कर सकते हैं:

  1. "प्रसारण संदेश"?
  2. संदेश की सदस्यता?

उत्तर

3

आप कमजोर संदर्भों का उपयोग करके ग्राहकों को संदेश प्रकाशित करने के लिए MessageBus या EventAggregator का उपयोग कर सकते हैं। my implementation (या the NuGet packgage) पर एक नज़र डालें।

Handle विधि पर HandleOnUIThreadAttribute को लागू करके यह आपके लिए UI थ्रेड पर संदेश संदेश को मार्शल कर सकता है (यदि आपको यूआई घटकों को अपडेट करने की आवश्यकता है)। आप अंदरूनी कामकाज और कैसे इस को लागू करने के बारे में अधिक जानना चाहते हैं

// The message 
public class LoginModelChanged 
{ 
    public LoginModelChanged(LoginModel model) 
    { 
     Model = model; 
    } 

    public LoginModel Model { get; private set; } 
} 

// Service that publishes messages 
public class ModelProviderService 
{ 
    private IMessageBus _messageBus; 
    private LoginModel _loginModel; 

    public ModelProviderService(IMessageBus messageBus) 
    { 
     _messageBus = messageBus; 
    } 

    public LoginModel LoginModel 
    { 
     get { return _loginModel; } 
     set 
     { 
      _loginModel = value; 
      _messageBus.Publish(new LoginModelChanged(value)); 
     } 
    } 
} 

// Subscribing ViewModel 
public class SomeViewModel : IHandle<LoginModelChanged> 
{ 
    public SomeViewModel(IMessageBus messageBus) 
    { 
     messageBus.Subscribe(this); 
    } 

    public void Handle(LoginModelChanged message) 
    { 
     // Do something with message.Model 
    } 
} 

;: आपके मामले में

प्रयोग की तरह कुछ होगा GitHub repository में स्रोत कोड देखें। जैसा कि आप चाहें कोड का उपयोग करने के लिए स्वतंत्र महसूस करें :)

3

आप एक WPF अनुप्रयोग के भीतर संदेशों वितरित करना चाहते हैं, तो आप prism ढांचे के EventAggregator साथ जा सकते हैं।

इवेंटएग्रेगेटर दर्शक को कमजोर रूप से घटनाओं की सदस्यता लेने की अनुमति देता है, जिसके लिए प्रेषक के बारे में कोई जानकारी नहीं होती है। यह आपको घटकों या मॉड्यूल में संदेशों को आसानी से वितरित करने की अनुमति देता है।