2010-09-12 25 views

Trả lời

1

CoerceValue thực sự nên được sử dụng để sửa một giá trị (giới hạn nó giữa min và max chẳng hạn). Tôi không biết liệu việc ném một ngoại lệ sẽ làm hỏng ứng dụng (bạn chỉ cần kiểm tra nó để tìm ra) hoặc khung sẽ xử lý nó, nhưng tôi sẽ không đề xuất nó vì nó sẽ chống lại việc thực hành mã hóa tốt.

Sắp xếp để nhận thêm thông tin cho ValidateValue đôi khi bạn phải xác định một số trường bổ sung trong lớp học của mình. Bạn có thể liên kết các trường đó hoặc đặt chúng trước khi đặt giá trị cho DP của bạn, sau đó trong ValidateValue bạn có thể truy cập vào các trường đó và nhận được thông tin bổ sung cần thiết. Trường bổ sung này tạo và chuyển thông tin qua các lớp "trung gian", có vẻ như được Microsoft chấp nhận, bởi vì đó là cách mà chúng có (tầm nhìn ngắn) được thiết kế cho khung công tác.

Tôi sẽ cung cấp cho bạn một ví dụ về DataGrid WPF mới. Nếu bạn đi theo lộ trình chuẩn và định nghĩa một RowValidationRule, bạn sẽ có quyền truy cập vào InSource (bảng của bạn) inorder để xác định xem một giá trị đã cho trong hàng của bạn đã tồn tại trong bảng chưa. Một điều rất chuẩn để làm, nhưng thông tin đó không được cung cấp trong cuộc gọi xác thực. Vì vậy, bạn phải tạo một trường trong lớp xác nhận của bạn để bạn có thể liên kết các mục ItemsGource của DataGrid, sau đó bạn có thể truy cập trường đó trong khi xác thực ...

+0

+1 Cảm ơn câu trả lời của bạn. Theo như tôi nhớ, tôi đã thử nghiệm hành vi được hiển thị nếu một ngoại lệ được ném vào CoerceValueCallback. Nó đã làm những gì tôi đã mong muốn, nhưng tôi đã không sử dụng nó trong mã sản xuất bởi vì nó nhìn tôi ô uế. Tuy nhiên các giải pháp với thiết lập các lĩnh vực bổ sung trước khi xác nhận có vẻ với tôi cũng không phải là rất thuận tiện và trong một số tình huống cũng không thể. Nhưng tôi nghĩ rằng nó giống như bạn đã viết, sử dụng CoerceValueCallback không được sử dụng bởi vì nó không có ý định làm điều này (dựa trên tên gọi lại và không có thêm thông tin này (msdn)) – HCL

0

đầu tiên: Tôi đã nghĩ một số để hiểu rằng DP có nghĩa là Thuộc tính phụ thuộc.

giây: Theo như tôi đã hiểu, CoerceValueCallback sắp sửa sửa giá trị của thuộc tính thành giá trị đã cho, không phải về việc xác thực giá trị. Vì vậy, tôi muốn lựa chọn ValidateValueCallback để xác thực. Chẳng phải đó được gọi là anyways sao?

+2

CoerceValueCallback nhận thông tin về DP và cá thể DP được thiết lập. Điều này có thể hữu ích trong một số trường hợp. ValidateValueCallback tuy nhiên chỉ nhận giá trị cần được xác nhận hợp lệ. Trong tình huống "bình thường", rõ ràng là tôi sử dụng ValidateValueCallback, nhưng nếu thông tin bổ sung là tiện dụng/mong muốn, liệu pháp lý có sử dụng CoerceValueCallback để xác thực không? – HCL

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