Tôi đang cố gắng tìm hiểu WPF và vấn đề MVVM, nhưng đã gặp phải một trở ngại. Câu hỏi này tương tự nhưng không hoàn toàn giống với câu hỏi này (xử lý các hộp thoại-in-wpf-with-mvvm) ...
Tôi có một biểu mẫu "Đăng nhập" được viết bằng mẫu MVVM.
Biểu mẫu này có ViewModel chứa Tên người dùng và Mật khẩu, được liên kết với chế độ xem trong XAML bằng các ràng buộc dữ liệu thông thường. Nó cũng có lệnh "Đăng nhập" được liên kết với nút "Đăng nhập" trên biểu mẫu, bằng cách sử dụng cơ sở dữ liệu thông thường.
Khi lệnh "Đăng nhập" kích hoạt, nó sẽ gọi một chức năng trong ViewModel sẽ tắt và gửi dữ liệu qua mạng để đăng nhập. Khi chức năng này hoàn thành, có 2 hành động:
Đăng nhập không hợp lệ - chúng tôi chỉ hiển thị MessageBox và tất cả đều ổn
Đăng nhập là hợp lệ, chúng tôi cần phải đóng biểu mẫu Đăng nhập và để nó trở lại đúng như
DialogResult
...
Vấn đề là, ViewModel không biết gì về chế độ xem thực tế, vậy làm thế nào nó có thể đóng chế độ xem và bảo nó trả về một DialogResult cụ thể ?? Tôi có thể dán một số mã trong CodeBehind và / hoặc chuyển View qua cho ViewModel, nhưng có vẻ như nó sẽ đánh bại toàn bộ điểm của MVVM ...
Cập nhật
Cuối cùng, tôi đã vi phạm "độ tinh khiết" của mẫu MVVM và View đã xuất bản một Closed
sự kiện và đưa ra một Close
phương thức. ViewModel sau đó sẽ chỉ gọi view.Close
. Chế độ xem chỉ được biết qua giao diện và được nối dây qua bộ chứa IOC, do đó không mất khả năng kiểm tra hoặc bảo trì.
Có vẻ khá ngớ ngẩn khi câu trả lời được chấp nhận là ở mức -5 phiếu! Mặc dù tôi nhận thức rõ về những cảm xúc tốt mà người ta có được khi giải quyết vấn đề trong khi "trong sạch", chắc chắn tôi không phải là người duy nhất nghĩ rằng 200 dòng sự kiện, mệnh lệnh và hành vi chỉ để tránh phương pháp một dòng trong tên của "mẫu" và "độ tinh khiết" là một chút vô lý ....
Close
phương pháp đơn giản vẫn là giải pháp tốt nhất. Mọi thứ khác trên các hộp thoại phức tạp khác là MVVM và cơ sở dữ liệu, nhưng dường như thật ngớ ngẩn khi thực hiện các "giải pháp" khổng lồ ở đây thay vì chỉ là một phương thức đơn giản ...