2013-04-22 33 views
7

Tôi đang phát triển một ứng dụng WPF và tôi có một số vấn đề để truyền đạt một mô hình xem với mô hình khác.Giao tiếp hai mô hình xem trong WPF MVVM

tôi có:

  1. MainViewModel
  2. ChildViewModel1
  3. ChildViewModel2

Mỗi khi một thay đổi sở hữu trong MainViewModel, ChildViewModel1 và ChildViewModel2 nên nhận được thông báo.

Có ai có thể đề xuất giải pháp khác không?

CHỈNH SỬA: Tôi đang nghĩ đến giải pháp MVVM nhẹ (http://simplemvvmtoolkit.codeplex.com/SourceControl/changeset/view/23821#313594.), đang triển khai xe buýt thông báo. Đó có phải là cách tiếp cận đúng không?

+0

Cách quá chung chung. Bạn cần phải tự mình thử điều này. Xem [INotifyPropertyChanged] (http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx) – tnw

+1

Tiêu đề của điều này là gây hiểu lầm và không có câu hỏi cụ thể. –

+1

Tôi không biết về các khung MVVM khác, nhưng MVVM Light và ReactiveUI bao gồm các thông báo triển khai bus như đã đề cập trong tiêu đề của bạn. – kenny

Trả lời

4

cách phổ biến cho viewmodels để giao tiếp giữa bản thân là implimentation của mẫu thiết kế theMediator

đây là làm thế nào nó được thực hiện trong MVVMLight http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/27aaefff-e463-451c-87d9-37367a343e0e

trong Prism là: http://blogs.u2u.be/diederik/post/2011/01/15/Using-the-Prism-40-Event-Aggregator.aspx

trong Caliburn là: http://www.mindscapehq.com/blog/index.php/2012/02/01/caliburn-micro-part-4-the-event-aggregator/

+0

hai liên kết có liên quan: 1) http://www.codeproject.com/Articles/35277/MVVM-Mediator-Pattern 2) http://joshsmithonwpf.wordpress.com/2009/04/06/a-mediator- prototype-for-wpf-apps/ – guilhermecgs

+0

@guilhermecgs, cả hai liên kết đều bị hỏng với tôi –

+1

@ Геннадий Ванин Новосибирск, cả hai liên kết đều hoạt động đối với tôi. Bạn có chắc là bạn không ở dưới tường lửa không? – guilhermecgs

2

Tôi sẽ sử dụng IService được triển khai bởi từng mô hình xem. Sau đó, trong các mô hình khung nhìn, bạn có thể chuyển các thuộc tính dịch vụ tới các thuộc tính của mô hình khung nhìn thực hiện INotifypropertychanged. Ví dụ, tôi có một dịch vụ gọi là INavigationService được triển khai bởi các mô hình khung nhìn của tôi và nó có các thuộc tính như CanNavigate, currentView, vv mà tôi liên kết với các mô hình khung nhìn của tôi. Các thay đổi đối với các thuộc tính này có thể khiến điều hướng hoặc thay đổi các thuộc tính mà các mô hình chế độ xem khác ràng buộc.

11

Trong hầu hết các trường hợp, tôi KHÔNG đề xuất sử dụng bất kỳ vị trí tập trung nào để chia sẻ "sự kiện"/"thông báo", như EventAggregator, v.v. Điều này dẫn đến các vấn đề sau đó liên quan đến mối quan hệ không rõ ràng giữa ViewModels. Các thông báo như vậy có ý nghĩa trong các trường hợp rất cụ thể khi quan hệ giữa người nghe/nhà xuất bản không được biết ngay cả trên giai đoạn thiết kế. Tôi sẽ đề nghị vẽ sơ đồ đơn giản với các quan hệ giữa ViewModels và tìm cách sử dụng các sự kiện .NET chuẩn, vì vậy khi bạn có các nhận thực rõ ràng giữa ViewModels như ViewModel1 có tham chiếu đến ViewModel2 để có thể đăng ký một sự kiện hoặc cung cấp gọi lại riêng, sẽ dễ dàng tạo các thông báo sự kiện như vậy.

+2

nó là một câu trả lời hay, nhưng vì ứng dụng của tôi rất đơn giản, tôi sẽ sử dụng một "địa điểm tập trung để chia sẻ" sự kiện "/" thông báo ", như EventAggregator" do rất nhiều tài liệu tham khảo và ví dụ mã số – guilhermecgs

+0

. điều đó sẽ dẫn đến rò rỉ bộ nhớ khủng khiếp rất nhanh. nếu bạn muốn xem mối quan hệ rõ ràng hơn, bạn có thể tạo một addon resharper sẽ recongnize đăng ký/bỏ đăng ký mẫu – Nahum

+0

Cách tiếp cận này dễ dàng hơn nhiều để gỡ lỗi hơn câu trả lời được chấp nhận. –

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