2009-05-18 15 views
5

Digamos que tengo una clase simpleenlace de datos y lanzar una excepción en el colocador

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; 
    } 
    } 
} 

Luego Quiero fijar un enlace para esta clase:

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

Ahora si entro valor de edad incorrecta en el cuadro de texto (digamos 200) se tragará la excepción en el setter y no podré hacer nada hasta que corrija el valor en el cuadro de texto. Quiero decir que el cuadro de texto no podrá perder el foco. Todo está en silencio, sin errores, simplemente no se puede hacer nada (incluso cerrar el formulario o toda la aplicación) hasta que se corrija el valor.

Parece un error, pero la pregunta es: ¿qué es una solución para esto?

+1

¿Hay alguna razón por la que está lanzando una excepción en lugar de implementar IDataErrorInfo? Creo que este último es el enfoque más idiomático en WinForms (y todavía funciona muy bien en WPF). –

Respuesta

3

Ok, aquí está la solución:

Tenemos que manejar BindingComplete caso de BinsingSource, CurrencyManager o una clase de BindingBanagerBase. El código puede verse así:

/* 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 ... piense en implementar IDataErrorInfo –

Cuestiones relacionadas