2009-04-02 22 views
9

Tôi có câu hỏi về trách nhiệm VM khi nói đến cửa sổ bật lên. Khi một ứng dụng được popping một hộp thông báo hoặc một số loại hộp thoại (với MVVM), hai tùy chọn mà chúng ta có là:Cách thích hợp để hiển thị cửa sổ bật lên sử dụng mẫu WPF M-V-VM

  1. đặt giao diện người dùng (ShowDialog()) mã trong VM mà có vẻ xấu
  2. có VM gửi một số loại sự kiện mà giao diện người dùng có thể đăng ký và hiển thị một hộp thoại trong mã phía sau (nhưng chúng tôi đang cố gắng để không có mã đằng sau :))

Các bạn xử lý trường hợp này như thế nào?

+0

Tôi tự hỏi liệu chuỗi này có hữu ích hay không. [http://stackoverflow.com/questions/454868/handling-dialogs-in-wpf-with-mvvm](http://stackoverflow.com/questions/454868/handling-dialogs-in-wpf-with-mvvm) – djcouchycouch

Trả lời

2

Không đặt mã giao diện người dùng trong máy ảo, điều đó chỉ gây ra rất nhiều cơn đau đầu trên đường.

Bạn thường có hai trường hợp khi bạn muốn bật cửa sổ hoặc cuộc hội thoại. Hoặc bạn đang làm điều đó vì một trường hợp kinh doanh, ví dụ: chế độ xem chi tiết về cách nhấp đúp vào danh sách hoặc hoàn toàn dựa trên giao diện người dùng, ví dụ: popping một cửa sổ tùy chọn. Trong trường hợp đầu tiên tốt nhất là sử dụng một sự kiện trong VM, trong trường hợp sau, tôi chỉ sử dụng một trình xử lý sự kiện. Một nguyên tắc nhỏ là, nếu bạn không cần bất kỳ biến VM quan trọng nào để thực hiện hành động thì bạn chỉ nên sử dụng một trình xử lý sự kiện.

Trên tất cả, hãy sử dụng đầu của bạn và tin tưởng vào phán quyết của bạn, bạn sẽ học cách sử dụng sớm.

0

Tôi sử dụng các sự kiện do chế độ xem xử lý. Tôi không thích nó 100%, nhưng nó cho phép thử nghiệm tự động.

0

Tạo giao diện cho hộp thoại bật lên của bạn ngay cả khi bạn định sử dụng hộp thư.

Ở cuối chế độ xem phân cấp chế độ xem của bạn có phương pháp cho người trình bày đăng ký lớp hoặc biểu mẫu triển khai cửa sổ bật lên.

Chế độ xem của bạn gọi là cửa sổ bật lên đã đăng ký.

1

Một vài tùy chọn khác không được đề cập bởi những người khác:

Một lệnh Rơ le

Các VM thực thi một lệnh mà tôi muốn gọi là "chuyển tiếp lệnh". Đó là một lệnh được xử lý bởi người khác và máy ảo không quan tâm ai. Việc thực thi lệnh không làm gì ngoài việc tăng sự kiện Executed. Chế độ xem của bạn sẽ đăng ký sự kiện này và hiển thị nội dung trong một Window mới (nội dung sẽ được chuyển thành tham số lệnh).

Lưu ý rằng lệnh chuyển tiếp không phải là lệnh được định tuyến. Nó không tìm kiếm một trình xử lý trong logic thực thi của nó. Nó chỉ làm tăng một sự kiện.

Một dịch vụ

Nếu có rất nhiều trường hợp mà bạn cần phải chứng minh điều gì đó trong một cửa sổ, hãy viết một dịch vụ giao diện người dùng mà sẽ chăm sóc của nó. Các máy ảo sau đó phụ thuộc vào dịch vụ này (có thể dễ dàng bị nhạo báng) để hiển thị nội dung trong các cửa sổ.

1

tôi muốn nói là cách tốt nhất để đi là xác định Popup trong XAML và sau đó sử dụng một DataTrigger ràng buộc đối với một số điều kiện trong ViewModel của bạn để ẩn hoặc hiển thị nó.Sau đó, nếu bạn quan tâm đến việc xử lý giá trị trả lại từ Popup, hãy EventTrigger trong các Popup thao tác các thuộc tính ViewModel để phản ánh thay đổi đó.

Có rất nhiều cuộc trò chuyện xung quanh loại khu vực này mà tôi nghĩ là bởi vì mọi người được sử dụng để lập trình trong thế giới WinForms. Tôi chưa tìm thấy giải pháp mà tôi cần bất kỳ mã nào trong chế độ xem ngoài việc tìm nạp dữ liệu ban đầu hoặc đặt DataContexts

0

Tôi đồng ý với Carlos sử dụng đăng ký sự kiện trong chế độ xem không phải là lựa chọn tốt. Theo như tôi hiểu MVVM, nó dẫn đến loại bỏ bất kỳ mã phía sau từ xem và tôi thực sự thích nó :). Một trong những proprs của MVVM là khả năng đơn vị kiểm tra nó. Nhưng tôi vẫn tin rằng mô hình xem có thể được kiểm tra ngay cả khi nó bật lên cửa sổ. Tất cả những gì chúng ta cần chỉ là sử dụng Window với Nội dung được khởi tạo với mô hình xem cần thiết. Tôi nghĩ rằng có thể có 2 tình huống có thể xảy ra khi VM mở hộp thoại mới: hiển thị cửa sổ tùy chọn/cài đặt hoặc hiển thị cửa sổ phụ thuộc vào logic nghiệp vụ. Trong trường hợp đầu tiên, mã cửa sổ mới là mã duy nhất của lệnh (lệnh cho nút 'Cài đặt' hoặc 'Tùy chọn'/mục menu). Trong trường hợp thứ hai, chúng ta có một số logic quyết định mở ra cửa sổ. Nhưng trong mọi trường hợp chúng ta có thể di chuyển mã mở cửa sổ mới vào phương thức/lớp riêng biệt và khi thử nghiệm VM của chúng tôi chỉ để giả lập phương thức/lớp này. Thậm chí nhiều hơn, lớp riêng biệt này có thể là một số loại WindowsController chung mà sẽ theo dõi tất cả các cửa sổ trong ứng dụng. Nhưng chúng tôi vẫn có thể nói rằng mô hình xem mở popup bằng cách sử dụng WindowsController helper và xem không biết bất cứ điều gì khác về các cửa sổ khác. Tất cả logic kinh doanh vẫn được tích hợp vào mô hình và mô hình xem.

0

Có một ViewModel cho cửa sổ bật lên và Xem dưới dạng điều khiển của người dùng. Tùy thuộc vào độ phức tạp của cửa sổ bật lên, nó có thể là máy ảo phổ quát hoặc VM cụ thể cho trường hợp kinh doanh. Khi cố gắng hiển thị nó từ máy ảo của cha mẹ, hãy tạo một lớp "máy chủ" cho máy ảo của cửa sổ bật lên (được thừa hưởng từ cửa sổ hoặc cửa sổ bật lên), hiển thị nó và gán máy ảo cho nó. Máy chủ phải có trách nhiệm định vị chế độ xem phù hợp (ví dụ: thông qua DataTemplate)

Trong trường hợp này, máy ảo của cửa sổ vẫn có thể kiểm tra và mức tối thiểu khớp với WPF cho máy ảo của phụ huynh được chấp nhận, IMO.

2

Khám phá Onyx. Đây là một thư viện M-V-VM (tiết lộ đầy đủ: Tôi là tác giả) dựa trên việc sử dụng các dịch vụ và các mẫu Service Locator hoặc Dependency Injection. Có các dịch vụ cho MessageBox và các hộp thoại phổ biến, và thật dễ dàng để thêm các dịch vụ của riêng bạn.

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