2012-03-04 17 views
6

Tôi đang tạo một ứng dụng WPF đơn giản. Tôi có chức năng OpenFile:Tôi có nên đặt chức năng này trong dạng xem (mã-đằng sau) hoặc trong ViewModel không?

private void OpenFile(string fileName) 
{ 
    if(!File.Exists(Helper.GetPath(fileName))) 
    { 
     MessageBox.Show("Error opening file"); 
    } 
    else 
    { 
     //Code to handle file opening 
    } 
} 

Lý tưởng nhất là chức năng này nên có mặt ở đâu? Tôi cảm thấy nó phải ở trong .xaml.cs bởi vì nó truy cập vào một MessageBox mà đi kèm trong phần View. Nhưng nó cũng gọi Helper của tôi, đó là trong mô hình. Vì vậy, tôi cũng nghĩ rằng nó có thể là trong ViewModel. Lợi thế của việc này là gì trong số View hoặc trong ViewModel? Ai đó có thể giúp tôi với một số con trỏ?

Cảm ơn.

Trả lời

7

Một trong những ưu điểm của việc đặt nó trong mô hình xem sẽ là testability. Bạn có thể viết một bài kiểm tra đơn vị kiểm tra xem hộp thông báo chỉ được hiển thị nếu tệp tồn tại chẳng hạn (chính xác hơn nó sẽ là một bài kiểm tra tích hợp nếu bạn đang nhấn hệ thống tệp).

Tuy nhiên, vì bạn đang sử dụng hộp thư trực tiếp, kiểm tra của bạn sẽ không bao giờ hoàn thành trên máy chủ xây dựng vì máy sẽ đợi đầu vào từ người dùng trong khi hộp thông báo được hiển thị.

Vì vậy, tôi sẽ làm việc với mô hình trừu tượng trong chế độ xem của bạn để bạn có thể mock the message box trong khi kiểm tra.

7

Chức năng này phải nằm trong ViewModel. Bạn cần tạo một thao tác trong chế độ xem của mình để hiển thị thông báo lỗi và gọi phương thức này thay vì MessageBox.Show. Hiển thị hộp tin nhắn cần được thực hiện trong View.

Thông thường bạn nên tránh triển khai bất kỳ logic nghiệp vụ nào trong số View chẳng hạn như xác thực hoặc xử lý tệp.

2

Nếu bạn đang sử dụng Microsoft Prism, bạn có thể sử dụng giao diện IInteractionRequest để chế độ xem tạo MessageBox, nhưng thực sự trả về phản hồi cần thiết cho chế độ xem.

Nếu bạn là không sử dụng Microsoft Prism, hãy xem phần này hoạt động như thế nào và mô phỏng nó hoặc sử dụng khung làm việc tương tự.


Về cơ bản, mã mà nên đi vào xem mô hình của bạn cho testability, nhưng thay thế dòng nơi bạn gọi một cách rõ ràng MessageBox và sử dụng IInteractionRequest đề cập để thay thế.

Đây là tài liệu phù hợp với kịch bản bạn đang muốn triển khai: Chapter 6: Advanced MVVM Scenarios. Xem phần đã nêu Mẫu tương tác của người dùng.

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