2011-07-12 30 views
5

Hôm nay tôi đã xem xét ví dụ MSDN để xác thực trên đầu vào của Hộp văn bản WPF (xem thêm: http://msdn.microsoft.com/en-us/library/ms753962.aspx).Tại sao ViewModel không được cập nhật khi WPF TextBox bị vô hiệu?

Trong ứng dụng của riêng tôi, tôi ràng buộc DataContext của khung nhìn vào một ViewModel, sử dụng mẫu MVVM. Một số TextBox là databind đến thuộc tính trên ViewModel và có ValidationRules cụ thể trên chúng.

Điều tôi đã khám phá là khi giá trị bị vô hiệu, sau khi giá trị được xác thực thành công trước đó, giá trị cũ sẽ vẫn còn trong ViewModel. Rất không hợp lý trong quan điểm của tôi, bởi vì các giá trị được sử dụng để thực hiện lệnh chẳng hạn.

Vấn đề chính xác của tôi cũng áp dụng trên ví dụ MSDN đã cho. Giá trị của một TextBox chỉ gửi lại cho nguồn của nó sau khi nó được xác thực thành công. Tôi muốn giữ logic hợp lệ, nhưng nó luôn cập nhật nguồn. Điều này có thể không?

Xin cảm ơn trước.

+0

Hãy thử một cách hoàn hảo để thiết lập BindingMode thành TwoWay: http://msdn.microsoft.com/it-it/library/system.windows.data.bindingmode.aspx – Tigran

+1

Điều bạn muốn trực tiếp chống lại thiết kế/mục đích của cơ chế . Vì vậy: Không thực sự có thể. –

+0

@Tigran, cảm ơn bạn đã trả lời nhưng tiếc là điều đó không tạo nên sự khác biệt. –

Trả lời

3

Như Rachel và Henk đã chỉ ra, đó là cách Quy tắc xác thực WPF được xây dựng. Nếu xác thực không thành công, nó sẽ không ghi giá trị cho thuộc tính.

Đối với lý do tại sao họ quyết định xây dựng theo cách đó, có thể là vì họ muốn có hành vi nhất quán khi xác thực không thành công. Đôi khi, giá trị trên chế độ xem không hợp lệ (ví dụ: Độ tuổi phủ định) nhưng giá trị này có thể được ghi vào thuộc tính. Các thời điểm khác không hợp lệ theo cách không thể ghi vào thuộc tính (ví dụ: Tuổi của "foo" không thể được chuyển đổi thành int). Nó có thể gây nhầm lẫn nếu hành vi là "ghi giá trị vào tài sản nếu có thể".

Giống như bạn, tôi thích nếu ViewModel của tôi được cập nhật bất cứ khi nào có thể, bất kể lỗi xác thực. Business objects are a different matter, nhưng "Fort Knox ViewModels" có vẻ lạ đối với tôi vì đầu vào không hợp lệ không chỉ OK, nó là được mong đợi. Thông thường trong ViewModel của tôi, tôi muốn biết "giá trị hiện tại", không phải là "giá trị hợp lệ cuối cùng". Đây là một trong những lý do tôi không thích ValidationRules.

+0

Điểm tuyệt vời: "'Fort Knox ViewModels' có vẻ lạ đối với tôi vì đầu vào không hợp lệ không chỉ OK, dự kiến." – Jay

+0

Ah ít nhất một người đồng tình với tôi! Sẽ hữu ích nếu có một số loại ghi đè thủ công cho hệ thống xác nhận! Tôi sẽ nhìn vào blog của bạn, âm thanh báo giá sáng tạo. Trong thời gian đó, tôi sẽ loại bỏ ValidationRules ra! –

2

Xác thực ở đó để đảm bảo rằng dữ liệu đã nhập hợp lệ cho thuộc tính được chỉ định. Nếu dữ liệu không hợp lệ, dữ liệu sẽ không được lưu trữ trong thuộc tính. Ví dụ, nếu ai đó gõ một chữ cái vào một TextBox bị ràng buộc vào một trường Integer, ứng dụng không nên thử và đặt ký tự vào một int vì một ngoại lệ sẽ được ném ra.

Cách khác là có phương thức IsValid() riêng biệt thực hiện kiểm tra xác thực thủ công trên dữ liệu của bạn và trả về true/false nếu dữ liệu hợp lệ hay không.

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