2009-05-18 28 views
5

Hãy nói rằng tôi có một lớp đơn giảnBinding dữ liệu và ném ngoại lệ trong setter

public class Person 
{ 
    public string Name { get; set; } 

    private int _age; 
    public int Age 
    { 
    get { return _age; } 
    set 
    { 
     if(value < 0 || value > 150) 
     throw new ValidationException("Person age is incorrect"); 
     _age = value; 
    } 
    } 
} 

Sau đó, tôi muốn thiết lập một ràng buộc cho lớp này:

txtAge.DataBindings.Add("Text", dataSource, "Name"); 

Bây giờ nếu tôi nhập giá trị độ tuổi chính xác trong hộp văn bản (nói 200) ngoại lệ trong setter sẽ bị nuốt và tôi sẽ không thể làm gì cả cho đến khi tôi sửa giá trị trong hộp văn bản. Tôi có nghĩa là hộp văn bản sẽ không thể mất tập trung. Đó là tất cả im lặng - không có lỗi - bạn chỉ không thể làm bất cứ điều gì (thậm chí đóng biểu mẫu hoặc toàn bộ ứng dụng) cho đến khi bạn sửa giá trị.

Dường như một lỗi, nhưng câu hỏi là: giải pháp cho việc này là gì?

+1

Có lý do nào bạn đang ném ngoại lệ thay vì triển khai IDataErrorInfo không? Tôi nghĩ rằng sau này là cách tiếp cận thành ngữ hơn trong WinForms (và nó vẫn hoạt động tốt trong WPF). –

Trả lời

3

Ok, đây là giải pháp:

Chúng ta cần phải xử lý BindingComplete trường hợp BinsingSource, CurrencyManager hoặc lớp BindingBanagerBase. Mã có thể trông giống như sau:

/* Note the 4th parameter, if it is not set, the event will not be fired. 
It seems like an unexpected behavior, as this parameter is called 
formattingEnabled and based on its name it shouldn't affect BindingComplete 
event, but it does. */ 
txtAge.DataBindings.Add("Text", dataSource, "Name", true) 
.BindingManagerBase.BindingComplete += BindingManagerBase_BindingComplete; 

... 

void BindingManagerBase_BindingComplete(
    object sender, BindingCompleteEventArgs e) 
{ 
    if (e.Exception != null) 
    { 
    // this will show message to user, so it won't be silent anymore 
    MessageBox.Show(e.Exception.Message); 
    // this will return value in the bound control to a previous correct value 
    e.Binding.ReadValue(); 
    } 
} 
+0

huuh ... suy nghĩ về việc triển khai IDataErrorInfo –