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:
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í:
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.
Pruebe habilitando el formateo de la siguiente manera:
this.chk1.DataBindings.Add(new System.Windows.Forms.Binding("EditValue", this.bindingSource1, "MyProperty", true));
También puede pasar por el siguiente enlace:
http://msdn.microsoft.com/en-us/library/system.windows.forms.binding.formattingenabled.aspx