2011-02-08 6 views
6

Tengo un objeto que implementa INotifyPropertyChanged y una casilla de verificación que está vinculada a una propiedad booleana de ese objeto. Esto funciona, pero he encontrado que cuando marque o desmarque la casilla de verificación, la propiedad enlazada del objeto no se actualizará hasta que haga clic en otro control, cierre el formulario o haga que la casilla de verificación pierda el foco.Forzar una casilla de verificación Formularios de Windows vinculados a datos para cambiar el valor de propiedad inmediatamente al hacer clic en

Me gustaría que la casilla de verificación surta efecto inmediatamente. Es decir, cuando marque la casilla, la propiedad se debe establecer de inmediato como verdadera, y cuando desactivo la casilla, se debe establecer inmediatamente como falsa.

He solucionado esto agregando un controlador para el evento CheckedChanged de la casilla de verificación, pero ¿hay una "manera correcta" de hacer esto que he pasado por alto?


Una pregunta similar desbordamiento de pila es Databound value of textbox/checkbox is incorrect until textbox/checkbox is validated.

Respuesta

6

Establecer su modo de unión a OnPropertyChanged:

this.objectTestBindingSource = new System.Windows.Forms.BindingSource(this.components); 
this.objectTestBindingSource.DataSource = typeof(WindowsFormsApplication1.ObjectTest); 

this.checkBox1.DataBindings.Add(
    new System.Windows.Forms.Binding(
    "Checked", 
    this.objectTestBindingSource, 
    "SomeValue", 
    true, 
    System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 

public class ObjectTest: System.ComponentModel.INotifyPropertyChanged 
{ 
    public bool SomeValue 
    { 
     get { return _SomeValue; } 
     set { _SomeValue = value; OnPropertyChanged("SomeValue"); } 
    } 

    private bool _SomeValue; 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string name) 
    { 
     if (string.IsNullOrEmpty(name)) { 
      throw new ArgumentNullException("name"); 
     } 

     if (PropertyChanged != null) { 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    ObjectTest t = new ObjectTest(); 
    this.objectTestBindingSource.Add(t); 
} 

Esto funciona tan pronto como haga clic en el cuadro.

Cuestiones relacionadas