2009-08-26 9 views
9

Tôi có một ứng dụng WPF mà tôi đã cố gắng viết theo phong cách MVVM. Nếu một ngoại lệ được ném (như khi một tài liệu được mở), tôi muốn hiển thị một MessageBox. Dễ làm, nhưng mã của tôi không cảm thấy khá đúng bởi vì các cuộc gọi MessageBox.Show là trong ModelView. Tôi nghĩ rằng loại điều đó được cho là sẽ sống trong View, nhưng tôi không được phép đặt mã trong View.Xử lý ngoại lệ MVVM

Vì vậy, câu hỏi thực sự có thể được chưng cất xuống cách được đề xuất để hiển thị MessageBox trong MVVM là gì?

Trả lời

16

Sử dụng một dịch vụ:

public void SomeMethodInYourViewModel() 
{ 
    try 
    { 
     DoSomethingDangerous(); 
    } 
    catch (Exception ex) 
    { 
     ServiceLocator.Resolve<IMessageService>().ShowMessage(ex.Message); 
    } 
} 

Bây giờ bạn đã tách riêng các máy ảo của bạn từ việc trình bày các thông điệp. Thậm chí bạn có thể quyết định không sử dụng các hộp thông báo chuẩn (xấu xí) và điều đó sẽ không ảnh hưởng đến các máy ảo của bạn.

+1

+1: Ngoài ra, một thay thế cho việc sử dụng ServiceLocator sẽ là sử dụng Dependency Injection để tiêm IMessageService vào máy ảo khi cần. –

+0

Do việc tách khỏi lớp trình bày, bạn có thể kiểm tra đơn vị ViewModel của mình. – jbe

9

Hãy xem Quỹ MVVM xuất sắc của Josh Smith theo số Codeplex. Cụ thể, hãy xem lớp Messenger, một cách truyền thông điệp nhẹ nhàng giữa các đối tượng ViewModel khác nhau, những người không cần phải biết về nhau.

Ngoài ra, tôi không tin rằng có quy tắc cứng và nhanh về "Không có mã trong Chế độ xem", mặc dù tốt nhất nên tránh nếu có thể ... hãy nhớ rằng XAML của bạn chỉ đơn giản là. trong một cú pháp khai báo; code-behind chỉ là C# hoặc VB.net để bổ sung (nếu hoàn toàn cần thiết!)

+0

+1 cho bit về bỏ qua quy tắc "không có mã trong chế độ xem". Đó là nhiều hơn một hướng dẫn anyway. :) –

2

Bạn cũng có thể chỉ cần đặt một thuộc tính chuỗi ErrorMessage trên lớp ViewModel mà Chế độ xem của bạn có thể liên kết.