2013-05-13 40 views
12

Làm cách nào để chia sẻ dữ liệu giữa nhiều Chế độ xem?
MVVM: Chia sẻ dữ liệu giữa ViewModels

Ví dụ: có một lớp có tên Project trong ứng dụng.

public class Project : ModelBase 
{ 
    private string _projectName; 

    public string ProjectName 
    { 
     get { return _projectName; } 
     set 
     { 
      _projectName = value; 
      RaisePropertyChanged(() => ProjectName); 
     } 
    } 
} 

Trong nhiều ứng dụng ViewModels nên truy cập ActiveProject.
Cách tốt nhất để chia sẻ Project giữa ViewModels là gì?

  • Mẫu hòa giải? (Messaging)
  • đối tượng tĩnh
  • Singleton pattern (Nếu có như thế nào?)

Tôi đã sử dụng Tin nhắn trước nhưng nó cần nhiều codding. Đối với tất cả các ViewModels tôi đã tạo thuộc tính ActiveProject và cũng phải đăng ký một messenger để cập nhật điều đó.


Tôi sử dụng khung công tác Ánh sáng MVVM.
Bất kỳ ví dụ mã nào cũng sẽ được đánh giá cao.

+0

'ActiveProject' của bạn có được tạo ra ở đâu đó bằng một trong các kiểu xem không? Nếu vậy, nhắn tin có lẽ sẽ là tốt nhất (và nó không * là * tiết). Tùy chọn khác là để chèn một 'ActiveProject' cho mỗi mô hình xem cần thiết trong khi thiết lập' ActiveProject' đời để singleton trong container IoC của lựa chọn - tùy chọn thứ ba bạn đã đề xuất ... Nhưng cho đến nay nó chủ yếu là đoán về phía tôi . –

+1

@ TrustMe-I'maDoctor Tại sao chúng ta WPFers luôn luôn overcomplicate tất cả mọi thứ? Nó sẽ không dễ dàng hơn để lưu trữ nó trong lớp 'App' như một thuộc tính tĩnh? –

+0

@ HighCore Đó luôn luôn là một lựa chọn ... Một tài sản đọc-viết tĩnh xoa tôi một cách sai lầm, quá dễ dàng để lạm dụng. :) –

Trả lời

5

Tôi sẽ tạo một ViewModel hoạt động như một phụ huynh cho tất cả các Chế độ xem dự án. (Hãy gọi nó là Giải pháp)

Giải pháp ViewModel sẽ có thuộc tính ActiveProject và một bộ sưu tập các dự án quan sát được.

+0

nhưng sau đó ... nếu bạn có nhiều chế độ xem cho một chế độ xem, làm thế nào để bạn ràng buộc thuộc tính được chia sẻ này? – inside

+0

@inside - có một dạng xem hình trên cùng, được gán cho DataContext của Chế độ xem. Các viewmodels khác là các thuộc tính của viewmodel trên cùng này và có thể bị ràng buộc bởi việc xác định đường dẫn liên kết tương ứng với viewmodel trên cùng –

+2

Tôi đã giải quyết nó theo một cách khác. Tôi có nhiều viewmodels mà tất cả chia sẻ cùng một ViewModelBase lớp, trong ViewModelBase tôi có Singleton của "Dự án" danh sách, sau đó trong View của tôi Tôi chỉ định ràng buộc đường dẫn như childVM.Projects, do đó, nó không quan trọng mà nó là vm, họ sẽ tất cả đều chia sẻ cùng một trường hợp của các dự án. Điều này cho phép tôi có nhiều chế độ xem cho mỗi DataContext và không có sự mơ hồ. – inside

1

Bạn có thể có một bộ sưu tập tĩnh mà mô hình chế độ xem của bạn điền trước khi bạn điều hướng đến mô hình chế độ xem mới. Mô hình khung nhìn đích có thể lấy dữ liệu từ bên trong hàm khởi tạo của nó.

Ví dụ: ViewModel1 (VM1) sẽ tạo một Dự án và điền vào nó. VM1 sau đó sẽ đưa Dự án vào một phân đoạn, tĩnh, sưu tập. Sau đó VM1 sẽ điều hướng đến một mô hình khung nhìn khác (VM2). Trong constructor của VM2 bạn sẽ đi đến collection và lấy Project được đặt trong đó bởi VM1.

Nếu bạn đã sử dụng từ điển cặp khóa-giá trị, nó cũng sẽ cho phép bạn chia sẻ dữ liệu khác giữa các kiểu xem.

1

Singleton chắc chắn sẽ trợ giúp. Để triển khai, nếu tôi có một lớp học có tên Người dùng:

private static User mInstance; 

    private User() //constructor 
    { 
    } 

    public static User Instance 
    { 
     get 
     { 
      if (mInstance == null) 
       mInstance = new User(); 
      return mInstance; 
     } 
    } 
2

Tôi muốn giới thiệu Mẫu hòa giải. Tôi đã sử dụng một EventAggregator cho kiểu nhắn tin này giữa các máy ảo trước đây và thực sự không có gì nhiều.

+0

Đây thực sự là câu trả lời được chấp nhận. Ngoài ra, có vẻ như những người đang chạy vào mẫu chống này chỉ xây dựng các ứng dụng hai lớp mà không có mô hình làm lớp thứ ba. –

1

Đừng, đừng. Không sử dụng các trình đơn theo cách này trong ứng dụng MVVM của bạn. Trong thực tế, lớp Project nên là một mô hình cho ViewModels của bạn. Chỉ cần vượt qua nó trong constructor của vm. Nếu bạn thực sự cần chia sẻ một thể hiện của lớp Project trong nhiều vm, sau đó sử dụng các nhà máy và một số loại cache khi xây dựng các mô hình khung nhìn. Nếu vm của bạn reguires một số thông tin thêm, chỉ cần tạo lớp mô hình đặc biệt mà sẽ lấy được từ dự án (hoặc thực hiện IProject), vì vậy bạn có thể easilly sử dụng nguyên tắc phân biệt giao diện.

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