Để trả lời cách tiếp cận của simbay, tôi nghĩ rằng đang bị loại bỏ.
Bạn không thể gọi Hoàn tác trong TextChanged vì thao tác hoàn tác vẫn đang được chuẩn bị bởi TextBox. Nó dường như đôi khi hoạt động và không phải lúc khác, vì vậy điều này cho thấy có một điều kiện chủng tộc giữa khi sự kiện được báo hiệu và hoàn thành việc chuẩn bị hoàn tác.
Tuy nhiên, gọi Undo được gọi trên Dispatcher sẽ cho phép hộp văn bản hoàn thành quá trình hoàn tác hoàn tác của nó. Bạn có thể xác nhận kết quả của thay đổi văn bản và sau đó quyết định xem bạn có muốn giữ lại hoặc hoàn tác thay đổi hay không. Đây có thể không phải là cách tiếp cận tốt nhất, nhưng tôi đã thử nó và thổi một loạt các thay đổi văn bản và bột nhão vào hộp văn bản và không thể tái tạo ngoại lệ.
"Câu trả lời được chấp nhận" CHỈ là tuyệt vời nếu bạn muốn ngăn nhập hoặc dán ký tự không hợp lệ, nhưng nói chung tôi thường thực hiện xác thực nhiều hơn về nhập văn bản của hộp văn bản và muốn xác minh giá trị văn bản cuối cùng. Nó không dễ dàng để phân biệt các văn bản cuối cùng từ một sự kiện xem trước bởi vì như xa như kiểm soát được quan tâm không có gì đã xảy ra được nêu ra.
Để trả lời câu hỏi của Terribad, câu trả lời của simbay tốt hơn và gọn gàng hơn trong nhiều tình huống hơn.
tb.TextChanged =+ (sender, args) =>
{
if(! MeetsMyExpectations(tb.Text))
Dispatcher.BeginInvoke(new Action(() => tb.Undo()));
}
Tôi đã đọc rất nhiều cuộc phiêu lưu hoang dã trong xác thực hộp văn bản và điều này dễ dàng như tôi đã tìm thấy.
Bạn nên sử dụng hành vi để thay thế. – SepehrM
SepehrM - bạn có thể cung cấp một ví dụ không? Điều gì sẽ xảy ra nếu bạn KHÔNG muốn xác thực nhưng chỉ muốn dừng thông báo ngoại lệ chết tiệt này khi thổi phiên của bạn? Tôi nhận được điều này khi người dùng gõ một chút wee quá nhanh hoặc có thể dán một đoạn dữ liệu vào trường. Thậm chí không xác nhận. – Allen