2009-03-13 24 views
6

Tôi có một hộp văn bản trong ứng dụng WPF được liên kết với thuộc tính trên lớp LINQ to Entities thực hiện IDataErrorInfo. Ràng buộc textbox có ValidatesOnExceptions = True và ValidatesOnDataErrors = True. Khi hộp văn bản được liên kết với một thuộc tính số nguyên và người dùng nhập văn bản thì viền hộp văn bản sẽ hiển thị màu đỏ vì tôi chưa thiết lập kiểu tùy chỉnh.Ràng buộc WPF - Cách xác định đối tượng không hợp lệ để ngăn Lưu

Trong phương thức Lưu của tôi làm cách nào để biết đối tượng không thể lưu vì nó không hợp lệ? Tôi muốn người dùng nhấp vào nút Lưu và tôi có thể thông báo cho họ về sự cố thay vì tắt nút Lưu.

Chúc mừng,

Dave

Trả lời

5

tôi đã không tìm thấy một cách dễ dàng để làm điều đó. Tôi tìm thấy một số mã xung quanh các bẫy để recurse thông qua tất cả các điều khiển trên biểu mẫu và xác định xem có ai trong số họ có lỗi xác nhận. Tôi đã kết thúc biến nó thành một phương pháp khuyến nông:

// Validate all dependency objects in a window 
internal static IList<ValidationError> GetErrors(this DependencyObject node) 
{ 
    // Check if dependency object was passed 
    if (node != null) 
    { 
     // Check if dependency object is valid. 
     // NOTE: Validation.GetHasError works for controls that have validation rules attached 
     bool isValid = !Validation.GetHasError(node); 
     if (!isValid) 
     { 
      // If the dependency object is invalid, and it can receive the focus, 
      // set the focus 
      if (node is IInputElement) Keyboard.Focus((IInputElement)node); 
      return Validation.GetErrors(node); 
     } 
    } 

    // If this dependency object is valid, check all child dependency objects 
    foreach (object subnode in LogicalTreeHelper.GetChildren(node)) 
    { 
     if (subnode is DependencyObject) 
     { 
      // If a child dependency object is invalid, return false immediately, 
      // otherwise keep checking 
      var errors = GetErrors((DependencyObject)subnode); 
      if (errors.Count > 0) return errors; 
     } 
    } 

    // All dependency objects are valid 
    return new ValidationError[0]; 
} 

Vì vậy, sau đó khi người dùng nhấp chuột vào nút Save trên một hình thức, tôi làm điều này:

var errors = this.GetErrors(); 
if (errors.Count > 0) 
{ 
    MessageBox.Show(errors[0].ErrorContent.ToString()); 
    return; 
} 

Nó làm việc nhiều hơn nó phải được nhưng sử dụng phương pháp mở rộng sẽ đơn giản hóa nó một chút.

+0

Đây là giải pháp tốt đẹp. Cảm ơn bạn. – Jirapong

3

Bạn có thể đặt NotifyOnValidationError thành true trên Binding s của mình, sau đó thêm trình xử lý cho sự kiện Error trên một số thành phần chính. Sự kiện sẽ kích hoạt bất cứ khi nào một lỗi được thêm vào hoặc bị xóa.

+0

Ý tưởng tuyệt vời! Tôi sẽ đăng giải pháp của mình khi tôi áp dụng giải pháp đó cho mã của mình! –

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