2008-11-24 29 views
7

Tôi đang thực hiện MVP/M-V-VM trong WPF và tôi đang có may mắn với nó cho đến nay. Tuy nhiên, tôi không thấy cách mô hình này hỗ trợ triển khai các hộp thoại Modal. Tôi đã bắt đầu công việc của tôi từ Crack.NET (http://www.codeplex.com/cracknetproject) để tìm hiểu cách thức hoạt động của công cụ này.Hộp thoại Model-View-Presenter và Modal Dialog .... Làm thế nào để?

Tôi có chế độ xem ShellView (chỉ là XAML) có trình đơn trên đó. Trình đơn liên kết với một lệnh trong ShellModelView có nội dung "EditPreferences".

ShellModelView triển khai ICommand cho EditPreferences và tại đây chúng tôi muốn đưa ra một hộp thoại để cho phép người dùng chỉnh sửa tùy chọn cho ứng dụng.

Một số vấn đề ở đây: 1. ShellModelView không có tham chiếu đến ShellView để cha mẹ chính xác hộp thoại. ShellModelView là DataContext của ShellView nhưng tôi không thấy một backreference được thiết lập. 2. ShellModelView không nên tải giao diện người dùng rõ ràng. Vậy mô hình tương tác thích hợp ở đây là gì? 3. Làm thế nào để xây dựng PreferencesDialog của tôi để nó được tách biệt đúng cách giữa logic và khung nhìn? PreferencesDialog chính nó cần phải là một cửa sổ, do đó bạn có thể gọi ShowDialog trên nó, nhưng điều đó có nghĩa là bạn cần một tham chiếu đến Window (ví dụ như View) để khởi tạo nó. Lý tưởng nhất là tôi có thể kiểm tra đơn vị mã/xác nhận hợp lệ trong PreferencesDialog mà không tạo ra khung nhìn (sử dụng khung nhìn Mock có lẽ?).

Trả lời

1

Bạn sẽ cần bộ điều khiển trong trường hợp của mình. Bộ điều khiển phải chịu trách nhiệm hiển thị cửa sổ hộp thoại tùy chọn.

Như tôi có thể hình dung nó, bộ điều khiển phải chịu trách nhiệm tạo ShellModelView và DataContext của khung nhìn ràng buộc với nó. Bộ điều khiển cũng phải chịu trách nhiệm xử lý thực hiện lệnh của EditPreferences. Trong logic thực thi, bộ điều khiển sẽ tạo ra một PreferencesDialog mới và mô hình khung nhìn tương ứng của nó.

Bạn có thể tìm thấy các mẫu tương tự trong Prism nếu bạn chưa thực hiện. Bạn cũng có thể tái sử dụng DelegateCommand được cung cấp ở đó :)

6

Có lẽ đây không phải là cách thích hợp để xem nó, nhưng đây là cách tiếp cận tôi thực hiện với M-V-VM trong WPF. Mở cửa sổ và hộp thoại hoặc chế độ xem "EditPreferences" là các chức năng cụ thể của giao diện người dùng. Nếu tôi viết lại toàn bộ giao diện người dùng thay thế tất cả các chế độ xem, tôi có thể kết hợp chế độ xem "EditPreferences" với chế độ xem khác và do đó không bao giờ muốn mở nó trong màn hình khác. Nếu điều này được gắn với ViewModel, sẽ rất khó để có được xung quanh. Trong tình huống cụ thể này, tôi sẽ có một nút hoặc mục trình đơn trong "ShellView" của tôi tạo ra một thể hiện mới của khung nhìn "EditPreferences" của tôi, và sau đó chuyển vào ViewModel "EditPreferences" có thể đến từ một thuộc tính trong "ShellViewModel" của tôi ", hoặc có lẽ chế độ xem" EditPreferences "của tôi sẽ tự tạo bản thân ViewModel.

Đây là một câu hỏi tương tự về SO mà về cơ bản nói điều tương tự: M-V-VM Design Question. Calling View from ViewModel

1

Có PreferencesDialog thực hiện một giao diện mà là một trong những thuộc tính của lệnh EditPreference. Lệnh sẽ tương tác với hộp thoại thông qua giao diện. Đối với Unit Testing, đối tượng giả sẽ thực hiện giao diện thay thế.

Lớp hộp thoại sau đó có thể nằm trên lớp cao nhất của bạn.

+1

Tôi nghĩ một trong những mục tiêu của MVVM là đạt được không có ViewModel biết điều gì về Chế độ xem (hoặc hộp thoại trong ví dụ của bạn)? Vì vậy, bất kỳ số lần xem nào (hoặc không có) có thể đang sử dụng một ViewModel bất kỳ lúc nào. Có ViewModel của bạn thiết lập mọi thứ trên một giao diện dạng xem sẽ phá vỡ điều đó. –

+0

Nó không phải vì giao diện cách ly lệnh từ việc thực hiện hộp thoại. –

+0

Đó là mẫu MVP. Thay đổi giao diện Chế độ xem được đề xuất của bạn sẽ phá vỡ ViewModel, ví dụ: thay đổi chữ ký của một phương thức hoặc kiểu thuộc tính, BAM bạn vừa phá vỡ ViewModel của bạn có một sự phụ thuộc trên giao diện. Trong MVVM, khung nhìn 'quan sát' ViewModel qua Bindings. Thay đổi Chế độ xem (ví dụ: thêm điều khiển) sẽ không yêu cầu thay đổi giao diện hoặc thậm chí biên dịch lại ViewModel. Điều thú vị là, một ViewModel có thể được 'quan sát' bởi nhiều Chế độ xem. Xem mẫu Observer trong cuốn sách GOF và đọc phần Tài liệu lăng kính 'Mô hình trình bày' nếu bạn quan tâm nhiều hơn về điều này :) –

0

2 cent của tôi là:

  1. Vượt qua một số loại hợp đồng viewfactory như các tham số lệnh hoặc tiêm một hợp đồng viewfactory vào mô hình xem.Mô hình khung nhìn họ sẽ sử dụng viewfactory để tạo ra bất kỳ khung nhìn phương thức/không phải phương thức nào mà nó cần. Khung nhìn cũng có thể xem như một tham số của phương thức Show/ShowModal của nó một viewmodel để hiển thị. Hơn nữa, viewfactory có thể sử dụng một datatemplate để hiển thị bất kỳ viewmodal nào được truyền vào như một tham số.

  2. Thêm thuộc tính ShowViewModel vào chế độ xem mô hình được đề cập. Sau đó, DataTrigger có thể xem cho thuộc tính này và khi thuộc loại cụ thể hiển thị chế độ xem, v.v.

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