Ho un mucchio di caselle di controllo sulla mia forma con le loro proprietà Checked legati alle proprietà booleane sul modello di dati:Perché dovrei ottenere un'eccezione di formato durante l'aggiornamento di un'associazione booleana con WriteValue?
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))
C'è anche un gestore di eventi condiviso per tutte le caselle di controllo sullo schermo che garantisce il valore databound è correttamente impostato sul valore selezionato.
private void AllCheckboxes_CheckedChanged(object sender, EventArgs e)
{
var chk = ((CheckBox)sender);
var binding = chk.DataBindings["Checked"];
if (binding != null)
binding.WriteValue();
}
In alcuni casi, per la prima volta questo modulo e le associazioni sono caricati, ottengo un'eccezione:
Non è possibile formattare il valore al tipo desiderato.
a System.ComponentModel.ReflectPropertyDescriptor.SetValue (Component Object, Object value) al System.Windows.Forms.BindToObject.SetValue (Object value) a System.Windows.Forms.Binding.PullData (riformattazione booleano, booleano forza) a System.Windows.Forms.Binding.WriteValue()
funziona correttamente per la prima casella di controllo per elaborare l'evento, ma poi la seconda getterà questa eccezione.
La fonte dei dati è un'interfaccia del mio DataModel
public interface IMyDataModel
{
bool MyBooleanProperty1 { get; set; }
bool MyBooleanProperty2 { get; set; }
bool MyBooleanProperty3 { get; set; }
}
e posso verificare che il modello di dati in sé sia impostata correttamente impostando un diritto punto di interruzione prima della .WriteValue nel gestore di eventi. Posso persino inserire un punto di interruzione nel settatore della proprietà booleana associata, e viene anche chiamato correttamente.
Se ho impostato la proprietà FormattingEnabled
del legame vero, lo fa risolvere il problema. Ma mi chiedo perché debba farlo anche in primo luogo, poiché lego una proprietà System.Boolean
nell'oggetto UI a una proprietà bool
nell'origine dati.
Perché dovrei essere sempre questa eccezione in questo caso?
hai abilitato 'immobili IsThreeState'? –
No, IsThreeState non è impostato – Rachel
Vorrei provare a impostare 'IsThreeState' o rendere l'associazione a nullable bool. Capisco che questo non sembri un problema di associazione nullo, ma mi aspetto di avere una gestione nulla nelle caselle di controllo. –