1. EventAggregator là gì
Để hiểu được Event aggregator trước tiên cần có kiến thức về mô hình MVVM. Tham khảo tại đây https://viblo.asia/p/co-ban-ve-mvvm-model-view-viewmodel-pattern-Do754wdWlM6
Khi dùng mô hình MVVM ta có thể chia xử lý viewmodel cho từng thành phần view ví dụ phần view Header sẽ dc xử lý trong file HeaderViewModel phần view chính Main sẽ có file MainViewModel xử lý. Việc chia này giúp cho code dễ dàng maintain và dễ đọc hơn tuy nhiên 1 vấn đề là có những lúc xử lý trên viewmodel của phần Main cần kích hoạt xử lý ở viewmodel của Header.
Đó là lúc ta cần EventAggegator. EventAggegator giúp giao tiếp giữa 2 view model bất kỳ (Có thể pass cả dữ liệu giữa 2 view model) 1 cách dễ dàng.
Cách xử lý của EventAggegator như ảnh dưới đây
Ví dụ tại HeaderViewModel ta định nghĩa 1 xử lý thay đổi màu của background và Subscriber xử lý đó với EventAggregator.
Sau đó trong MainViewModel khi cần chạy xử lý trên HeaderViewModel ta chỉ cần Publisher với chữ ký (xem ví dụ) giống với chữ ký của xử lý mà HeaderViewModel đã subscriber.
2. Ví dụ
Tạo 1 class BackgroundColor.cs làm chữ ký (dùng để trao đổi dữ liệu giữa 2 model)
1 2 3 4 5 |
public class BackgroundColor { private string _color; public string Color { get => _color; set => _color= value; } } |
Subscriber xử lý trong HeaderViewModel.cs
1 2 3 4 5 6 7 8 9 10 |
public ApplicationMainViewModel(IEventAggregator eventAggregator) { eventAggregator.GetEvent<PubSubEvent<BackgroundColor>>().Subscribe(ChangeColorBg); } private void ChangeColorBg(BackgroundColor color) { //TODO method dc goi khi co Publisher } |
Trong MainViewModel.cs publisher event
1 2 3 4 5 6 7 8 9 10 11 12 |
private IEventAggregator eventAggregator; public ApplicationMainViewModel(IEventAggregator eventAggregator) { this.eventAggregator = eventAggregator; } public void AbcMethod() { BackgroundColor colorObject = new BackgroundColor(); this.eventAggregator.GetEvent<PubSubEvent<BackgroundColor>>().Publish(colorObject); //Sau khi chay lenh nay colorObject se dc gui den method ChangeColorBg } } |