2013-01-18 17 views
7

Sto prototipando un'applicazione WPF con il pattern MVVM. Dopo aver risposto a this question, ho impostato uno ModelProviderService che espone i modelli come proprietà. I consumatori del servizio sono i viewmodels, cioè estraggono i loro modelli dal servizio invece di istanziarli da soli.Implementazione di un meccanismo di messaggio/sottoscrizione in C#

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(); 
    }  
} 

Ora, ecco cosa accadrà:

  • Un ViewModel modifica una proprietà di esempio la proprietà LoginModel.
  • ViewModel spinge la proprietà del modello di nuovo al servizio impostando la sua proprietà: modelService.LoginModel.MyProperty = localLoginModel.MyProperty;
  • Il servizio pubblica un messaggio: "Ehi, il mio modello di tipo LoginModel appena cambiato"
  • Qualsiasi altro viewmodel che si è iscritto a questo messaggio estrarrà questo modello modificato dal servizio.

Come posso implementare:

  1. il "messaggio broadcast"?
  2. l'abbonamento al messaggio?

risposta

3

È possibile utilizzare uno MessageBus o EventAggregator per pubblicare messaggi per gli abbonati utilizzando riferimenti deboli. Dai un'occhiata a my implementation (o the NuGet packgage).

Può anche schierare la gestione di thread UI per voi (se è necessario aggiornare i componenti dell'interfaccia utente) applicando la HandleOnUIThreadAttribute sul metodo Handle messaggio.

uso nel tuo caso sarebbe qualcosa di simile:

// 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 
    } 
} 

Se volete saperne di più sul funzionamento interno e le modalità di attuazione di questo; Controlla il codice sorgente nel GitHub repository. Sentiti libero di usare il codice come preferisci :)

3

Se si desidera distribuire i messaggi all'interno di un'applicazione WPF, si può andare con EventAggregator di prism quadro.

EventAggregator consente a viewmodels di associare debolmente agli eventi, non richiedendo alcuna conoscenza del mittente. Ciò consente di distribuire facilmente i messaggi tra componenti o moduli.