c# data-binding binding .net-3.5

c# - ¿Por qué debería obtener una excepción de formato al actualizar un enlace booleano con WriteValue?



data-binding binding (4)

Es difícil decir con certeza qué está pasando sin una forma de reproducir el problema.

Pero al menos puedo explicar por qué la configuración de FormattingEnabled hace que la excepción desaparezca:

http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Binding.cs,853

WriteData llama a PullData con reformat = true y force = true .

Desde tu pila de llamadas, parece que debes estar ingresando en este bloque:

// Put the value into the data model if (!parseFailed) { this.bindToObject.SetValue(parsedValue); }

Inmediatamente después, la excepción se vuelve a lanzar a menos que FormattingEnabled = true . Así que configurar FormattingEnabled aquí oculta el problema, ya que parece que Binding asume que usted va a manejar cualquier problema de formateo / análisis que haya encontrado hasta ahora.

En cuanto a por qué se lanza la excepción en primer lugar ... No sé. Nada es obvio buscando aquí:

http://referencesource.microsoft.com/#system/compmod/system/componentmodel/ReflectPropertyDescriptor.cs,1138

Me gustaría saber si su problema persiste si encuentra una forma de agregar sus enlaces de datos sin su clase personalizada de BindingValue . También me gustaría saber si tienes oyentes conectados en BindingValue .

Tengo un montón de casillas de verificación en mi formulario con sus propiedades comprobadas vinculadas a propiedades booleanas en el modelo de datos:

chk1.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty1", false)) chk2.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty2", false)) chk3.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty3", false))

También hay un controlador de eventos compartido para todas las casillas de verificación en la pantalla que garantiza que el valor de los datos está correctamente establecido en el valor verificado.

private void AllCheckboxes_CheckedChanged(object sender, EventArgs e) { var chk = ((CheckBox)sender); var binding = chk.DataBindings["Checked"]; if (binding != null) binding.WriteValue(); }

En algunos casos, la primera vez que se cargan este formulario y los enlaces, obtengo una excepción:

No se puede formatear el valor al tipo deseado.

en System.ComponentModel.ReflectPropertyDescriptor.SetValue (Componente de objeto, Valor de objeto) en System.Windows.Forms.BindToObject.SetValue (Valor de objeto) en System.Windows.Forms.Binding.PullData (Boolean reformat, Boolean force) en System.Windows .Forms.Binding.WriteValue ()

Funciona correctamente para la primera casilla de verificación para procesar el evento, pero luego el segundo lanzará esta excepción.

La fuente de datos es una interfaz de mi modelo de datos

public interface IMyDataModel { bool MyBooleanProperty1 { get; set; } bool MyBooleanProperty2 { get; set; } bool MyBooleanProperty3 { get; set; } }

Y puedo verificar que el modelo de datos mismo esté configurado correctamente al establecer un punto de interrupción justo antes de .WriteValue en el controlador de eventos. Incluso puedo poner un punto de interrupción en el setter de la propiedad boolean vinculada, y también se llama correctamente.

Si configuro la propiedad FormattingEnabled del enlace como verdadero, soluciona el problema. Pero me pregunto por qué tengo que hacer eso en primer lugar, ya que estoy vinculando una propiedad System.Boolean en el objeto UI a una propiedad bool en la fuente de datos.

¿Por qué recibiría esta excepción en este caso?


Creo que arroja una excepción si el parse / formato no se está manejando, por lo que formattingEnabled parece funcionar.

Intente manejar los eventos Binding.Format y Binding.Parse para verificar que los tipos que envía (y espera) son correctos.


Esto es lo que haría. El modelo debe implementar la interfaz INotifyPropertyChanged . Agregue un BindingSource a su formulario desde ToolBox. Establezca el DataSource del mismo en su modelo. En cada casilla, configure el enlace de datos. OnPropertyChanged la ventana Avanzado y establecería el Modo de actualización del origen de datos en OnPropertyChanged . En este caso, no tiene que configurar ningún controlador de eventos para sus casillas de verificación.