2011-01-05 50 views
30

Tôi có dự án khung công tác WPF/Entity Framework (4.0) với nhiều đối tượng. Tôi muốn xây dựng ứng dụng để tôi có thể có trạng thái lựa chọn đối tượng được chia sẻ trên các mô hình xem.Ví dụ cụ thể về chia sẻ trạng thái giữa nhiều chế độ xem (WPF MVVM)

Ví dụ: Chúng tôi có các lớp Ô tô, Tài xế, Hành khách và Hàng hóa. Chúng tôi cũng có UserControls cho CarList, DriverList, vv và cửa sổ soạn thảo cho CarEditor, DriverEditor, vv Hơn nữa, chúng tôi có chế độ xem cho tất cả các (CarListViewModel, DriverListViewModel, CargoEditorViewModel, v.v ...). Điều này tất cả tạo ra một giao diện dockable nơi người dùng có thể có nhiều danh sách đối tượng, biên tập viên, và người xem mở. Những gì tôi muốn là một ví dụ mã cụ thể về cách kết hợp nhiều khung nhìn để chọn một chiếc xe trong CarList sẽ khiến chiếc xe đó hoạt động trực tiếp trong CarEditorView, nhưng cũng được chọn trong bất kỳ chế độ xem nào khác mà bối cảnh là hợp lệ (chẳng hạn như DriverByCarView- hoặc chỉ DriverList nếu có một vị từ bộ lọc).

Có một số đề xuất và thảo luận dựa trên câu hỏi này. Hai phương pháp mà dường như chiếm ưu thế là:

  • 3018307: Thảo luận chia sẻ trạng thái bằng cách nhắc đến một thông điệp hệ thống phụ
  • 1159035: Thảo luận chia sẻ trạng thái bằng cách sử dụng một kèm theo viewmodel

là một trong những cách tiếp cận tốt hơn cái kia?

Có ai có ví dụ cụ thể về một trong hai phương pháp này dưới dạng một dự án viết mã hoặc viết nhỏ không?

Tôi vẫn đang tìm hiểu WPF, vì vậy các gợi ý cho các điểm nhập để đọc các nguyên tắc cơ bản về API được đánh giá cao, nhưng xem xét các ví dụ mã là nơi tôi thường đến.

Cảm ơn


Trong trường hợp có ai quan tâm, đây là một số cuộc thảo luận tương tự khác:

  • 3816961: thảo luận trở lại nhiều viewmodels tùy thuộc vào loại đối tượng (tức là một bộ sưu tập các loại tùy ý tôn trọng một giao diện cụ thể)
  • 1928130: Thảo luận xem có nên tổng hợp chế độ xem làm thuộc tính của các chế độ xem khác không (ví dụ: chế độ xem MainWindow mô hình bao gồm các chế độ xem bảng điều khiển)
  • 1120061: Về cơ bản thảo luận liệu có sử dụng chiến lược viewmodel cho mỗi mô hình hay chiến lược yếu tố xem trên mỗi chế độ xem hay không.
  • 4244222: Thảo luận xem có tổ chức chế độ xem khi sử dụng phân cấp đối tượng lồng nhau hay không.
  • 4429708: Thảo luận chia sẻ bộ sưu tập giữa các chế độ xem trực tiếp nhưng không đi sâu vào chi tiết.
  • List item: Thảo luận quản lý nhiều lựa chọn trong một chế độ xem đơn.
+0

Là một phụ lục liên quan đến hai bài báo được liên kết đầu tiên: Có cách tiếp cận nhắn tin là hợp lệ chỉ khi chia sẻ trạng thái là giữa các mô hình - không xem; trong khi viewmodel kèm theo là hợp lệ trong trường hợp khác. Không chắc chắn nếu đó là sự thật/hợp lệ. – JohnMetta

Trả lời

12

Cách điển hình để đạt được điều này là sử dụng một sứ giả để xuất bản một tin nhắn được chọn lựa chọn ô tô chi tiết chiếc xe đã chọn.Không có hoặc nhiều ViewModels có thể đăng ký với tin nhắn CarSelected. ViewModels mà quan tâm đến chiếc xe hiện đang được chọn có thể nghe tin nhắn và sau đó hành động phù hợp.

Phương pháp tiếp cận tin nhắn cung cấp thiết kế tách rời, nơi nhà xuất bản và người đăng ký không có sự phụ thuộc lẫn nhau để có thể dễ dàng phát triển độc lập - họ chỉ cần biết về tin nhắn xe. Các sứ giả là một thực hiện của mô hình hòa giải.

Trong Prism messenger là EventAggregator và được sử dụng để xuất bản và đăng ký tin nhắn.

Cập nhật

Ngoài những lợi thế kiến ​​trúc các EventAggregator mang lại, nó cũng thực hiện sự kiện yếu để ngăn chặn vấn đề rò rỉ bộ nhớ với các thuê bao mà không huỷ đăng ký một cách rõ ràng.

Xin xem sau đây cho tài liệu EventAggregator:

http://msdn.microsoft.com/en-us/library/ff649187.aspx

Prism:

http://compositewpf.codeplex.com/

Prism Ví dụ

public class ViewModel1 
{ 
    private readonly IEventAggregator _eventService; 
    private Car _selectedCar; 

    public ViewModel1(IEventAggregator eventService) 
    { 
     _eventService = eventService; 
    } 

    //Databound property... 
    public Car SelectedCar 
    { 
     set 
     { 
      _selectedCar = value; 

      var msg = new CarSelectedMessage { Car = _selectedCar }; 

      _eventService.GetEvent<CarSelectedEvent>().Publish(msg); 
     } 
    } 
} 

public class ViewModel2 
{ 
    public ViewModel2(IEventAggregator eventService) 
    { 
     eventService.GetEvent<CarSelectedEvent>().Subscribe(msg => 
     { 
      //DoStuff with msg... 
     }); 
    } 
} 

public class Car {} 

public class CarMessage 
{ 
    public Car Car { get; set; } 
} 

public class CarSelectedEvent : CompositePresentationEvent<CarMessage> {} 
+0

Mặc dù thiếu một con trỏ đến một ví dụ, điều này không giúp ích gì. Tôi đã nghĩ mẫu người quan sát hơn là người hòa giải, điều này có ý nghĩa hơn một chút. Tôi sẽ nhìn vào Prism. Cảm ơn. – JohnMetta

+0

@JohnMetta Tôi đã thêm một vài liên kết cho Prism. Đó là khuôn khổ tôi sử dụng, vì vậy nếu bạn có bất kỳ câu hỏi nào, vui lòng trợ giúp. –

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