2011-09-02 25 views
6

Trong ứng dụng dựa trên MVVM của tôi, tôi cần phải xác thực các trường trong mục nhập dữ liệu từ. Nếu có thể, tôi muốn sử dụng ràng buộc xác nhận hợp lệ WPF tiêu chuẩn với ErrorTemplates.xác thực trường xác thực và không đồng bộ trong WPF

Tuy nhiên tôi muốn thực hiện các logic xác nhận để được hoàn toàn điều khiển/kích hoạt bởi các ViewModel (push to View, không kéo bởi View) vì những lý do sau đây:

  1. Nó phải làm việc không đồng bộ vì logic xác thực có thể mất một lúc để thực thi.
  2. tôi cần phải được xác định hơn và tốt grained khi xác nhận logic là để được thực thi (ví dụ chỉ sau khi người dùng nhấp "Apply" hoặc khi trạng thái nội bộ thay đổi theo một cách mà mục đột nhiên trở nên không hợp lệ)

Tôi biết Silverlight có INotifyDataErrorInfo được giới thiệu chính xác cho mục đích này, nhưng WPF thì không. Làm thế nào tôi có thể vẫn có logic xác nhận của tôi được tạo ra một cách xác định và không đồng bộ?

+0

Dường như nó chỉ là không thể, vì vậy tôi cần phải đi một con đường khác như đã mô tả ở đây: http://stackoverflow.com/questions/7293277/create-a-visualtree-off-of -a-control-template-in-code – bitbonk

+0

Lưu ý rằng WPF 4.5 đã giới thiệu hỗ trợ tương tự như Silverlight cho INotifyDataErrorInfo, ở đây ví dụ: http://anthymecaillard.wordpress.com/2012/03/26/wpf-4-5-validation -asynchrone/ – GrahamMc

Trả lời

0

Xác thực được tích hợp cho WPF và Silverlight có nghĩa là để xác thực phía máy khách nhanh (chẳng hạn như Regex, giá trị phân tích cú pháp, v.v.).

Nếu bạn cần truy cập máy chủ để thực hiện xác thực (hoặc xác thực mất nhiều thời gian), tôi sẽ thực hiện điều đó theo cách tùy chỉnh. Chẳng hạn như khi nhấp chuột vào một nút lưu vv

Vì vậy, nói rằng bạn có một phương pháp Lưu trong một ViewModel (bạn không đề cập mà MVVM khuôn khổ bạn sử dụng):

public void Save() 
{ 
    //Do your validation, this might start a new thread (I use Async CTP myself) 

    //If validation is good, do your extra work, else display validation errors 
} 

Tôi chỉ sẽ làm tất cả những công việc bắt buộc đối với điều này trong một hành động trong ViewModel

+0

Vì vậy, bạn đang nói, tôi không thể sử dụng ErrorTemplates? Tôi cần phải dựa vào ông xây dựng trong các mẫu lỗi của WPF và điều khiển tùy chỉnh. ví dụ. Tôi muốn hiển thị đường viền màu đỏ chuẩn xung quanh một hộp văn bản không hợp lệ. Làm thế nào tôi có thể buộc biên giới này được hiển thị? – bitbonk

+0

Tôi đã đề xuất sử dụng một phương pháp như câu trả lời hàng đầu đề xuất ở đây: http://stackoverflow.com/questions/921601/how-can-i-handle-a-validation-error-in-my-viewmodel-instead-of -my-views-code-beh. Tôi không nghĩ rằng nó là một ý tưởng tốt để sử dụng xác nhận được xây dựng trong nếu nó sẽ là một hoạt động chạy dài (nó sẽ luôn luôn khóa giao diện người dùng). – jonathanpeppers

+0

Tôi vẫn cần phải thực hiện một số loại "ErrorTemplate" và hiển thị nó một khi máy ảo đặt ra một sự kiện. Vì một số biểu mẫu của tôi không có nhiều trường nên tôi không muốn hình ảnh lỗi là một phần của cây trực quan nhưng chỉ được tạo (ví dụ: bởi hành vi) khi lỗi xác thực xảy ra cho trường đó: Xem thêm thông tin trong câu hỏi tiếp theo của tôi: http://stackoverflow.com/questions/7293277/create-a-visualtree-off-of-a-control-template-in-code – bitbonk

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