2013-01-18 29 views
7

Tôi đang tạo mẫu ứng dụng WPF với mẫu MVVM. Theo sau một câu trả lời cho this question Tôi đã thiết lập một số ModelProviderService để hiển thị các mô hình dưới dạng thuộc tính. Người tiêu dùng của dịch vụ là chế độ xem, tức là họ kéo mô hình của họ ra khỏi dịch vụ thay vì tự tạo ra họ.Thực hiện cơ chế đăng ký/nhắn tin trong 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(); 
    }  
} 

Bây giờ, đây là những gì sẽ xảy ra:

  • Một viewmodel thay đổi thuộc tính của ví dụ tài sản LoginModel.
  • ViewModel đẩy bất động sản mô hình lại dịch vụ bằng cách thiết lập tài sản của mình: modelService.LoginModel.MyProperty = localLoginModel.MyProperty;
  • Dịch vụ này phải công bố một thông điệp: "Này, mô hình của tôi về loại LoginModel chỉ thay đổi"
  • Bất kỳ chế độ xem nào khác đã đăng ký với thông báo này sẽ kéo mô hình đã thay đổi này khỏi dịch vụ.

Làm thế nào tôi có thể thực hiện:

  1. "thông điệp phát sóng"?
  2. đăng ký thư?

Trả lời

3

Bạn có thể sử dụng MessageBus hoặc EventAggregator để xuất bản thư cho người đăng ký bằng cách sử dụng các tham chiếu yếu. Hãy xem my implementation (hoặc the NuGet packgage).

Nó cũng có thể sắp xếp xử lý tin nhắn với chuỗi giao diện người dùng cho bạn (nếu bạn cần cập nhật thành phần giao diện người dùng) bằng cách áp dụng HandleOnUIThreadAttribute theo phương pháp Handle.

Cách sử dụng trong trường hợp của bạn sẽ là một cái gì đó như:

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

Nếu bạn muốn biết thêm về các hoạt động bên và làm thế nào để thực hiện điều này; Kiểm tra mã nguồn trong số GitHub repository. Vui lòng sử dụng mã như bạn muốn :)

3

Nếu bạn muốn phân phối thư trong ứng dụng WPF, bạn có thể đi với EventAggregator của khung prism.

Sự kiệnAggregator cho phép chế độ xem yếu kém để subsribe cho các sự kiện, không cần kiến ​​thức về người gửi. Điều này cho phép bạn dễ dàng phân phối thông điệp trên các thành phần hoặc mô-đun.

Các vấn đề liên quan