2013-01-18 13 views
7

Prototypuję aplikację WPF z wzorcem MVVM. Po odpowiedzi na this question ustawiłem ModelProviderService, który ujawnia modele jako właściwości. Konsumenci tej usługi to modele widokowe, tzn. Wyciągają swoje modele z serwisu, zamiast tworzyć je samodzielnie.Implementowanie mechanizmu wiadomości/subskrypcji w języku 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(); 
    }  
} 

Teraz tutaj jest to, co powinno się zdarzyć:

  • ViewModel zmienia właściwość np właściwość LoginModel.
  • ViewModel popycha właściwość modelu z powrotem do służby przez ustawienie jego właściwości: modelService.LoginModel.MyProperty = localLoginModel.MyProperty;
  • Usługa publikuje komunikat: „Hej, mój model typu LoginModel prostu zmieniły”
  • Każdy inny model widoku, który zasubskrybował tę wiadomość, pobierze ten zmieniony model z usługi.

Jak mogę realizować:

  1. "Message broadcast"?
  2. subskrypcji wiadomości?

Odpowiedz

3

Można użyć numeru MessageBus lub EventAggregator do publikowania wiadomości do subskrybentów za pomocą słabych odniesień. Spójrz na my implementation (lub the NuGet packgage).

Może również przekazać obsługę komunikatów do wątku UI (jeśli potrzebujesz zaktualizować składniki interfejsu użytkownika), stosując metodę HandleOnUIThreadAttribute w metodzie Handle.

Wykorzystanie w Twoim przypadku będzie coś takiego:

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

Jeśli chcesz wiedzieć więcej na temat wewnętrznych mechanizmów i sposobu realizacji tego; Sprawdź kod źródłowy w GitHub repository. Zapraszam do korzystania z kodu, jak chcesz :)

3

Jeśli chcesz rozpowszechniać wiadomości wewnątrz aplikacji WPF, można iść z EventAggregator z prism ram.

EventAggregator pozwala na słabe śledzenie podglądu wydarzeń, nie wymagając żadnej wiedzy o nadawcy. Pozwala to na łatwą dystrybucję wiadomości między komponentami lub modułami.

Powiązane problemy