2009-05-18 10 views
5

Diciamo che ho una semplice classeAssociazione dati e gettando eccezione nel 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; 
    } 
    } 
} 

Poi voglio installare un binding per questa classe:

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

Ora, se entro in valore di età non corretto nel la casella di testo (diciamo 200) l'eccezione nel setter verrà inghiottita e non potrò fare nulla fino a quando non correggo il valore nella casella di testo. Intendo dire che la casella di testo non sarà in grado di perdere la concentrazione. È tutto silenzioso - nessun errore - non puoi fare nulla (nemmeno chiudere il modulo o l'intera applicazione) finché non correggi il valore.

Sembra un bug, ma la domanda è: che cosa è una soluzione per questo?

+1

C'è un motivo per cui stai un'eccezione piuttosto che attuare IDataErrorInfo? Penso che quest'ultimo sia l'approccio più idiomatico in WinForms (e funziona ancora bene anche in WPF). –

risposta

3

Ok, ecco la soluzione:

Abbiamo bisogno di gestire l'evento BindingComplete di BinsingSource, CurrencyManager o di classe BindingBanagerBase. Il codice può apparire come questo:

/* 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 ... pensa all'implementazione di IDataErrorInfo –