我在表单上有一堆复选框,它们的选中属性与数据模型上的布尔属性绑定:
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))
屏幕上的所有复选框也共用一个事件处理程序,以确保数据绑定的值正确设置为所选值。
private void AllCheckboxes_CheckedChanged(object sender, EventArgs e)
{
var chk = ((CheckBox)sender);
var binding = chk.DataBindings["Checked"];
if (binding != null)
binding.WriteValue();
}
在某些情况下,当首次加载此表格和绑定时,我会遇到异常:
无法将值格式化为所需的类型。
在System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value)处 在System.Windows.Forms.BindToObject.SetValue(Object value)处 在System.Windows.Forms.Binding.PullData(Boolean reformat, Boolean force)处 在System.Windows.Forms.Binding.WriteValue()处
第一个复选框正确处理事件,但接着第二个会抛出此异常。
数据源是我的数据模型的一个接口。
public interface IMyDataModel
{
bool MyBooleanProperty1 { get; set; }
bool MyBooleanProperty2 { get; set; }
bool MyBooleanProperty3 { get; set; }
}
我可以验证数据模型本身是否正确设置,方法是在事件处理程序中的 .WriteValue 之前设置断点。我甚至可以在绑定的布尔属性的 setter 中设置断点,也会被正确调用。
如果我将绑定的 FormattingEnabled
属性设置为 true,则可以解决该问题。但是我想知道为什么我必须这样做,因为我正在将 UI 对象中的 System.Boolean
属性绑定到数据源上的 bool
属性。
为什么在这种情况下会出现异常?
IsThreeState
属性? - Dave AlperovichIsThreeState
或将绑定设置为可空布尔值。我知道这看起来不像是一个空绑定问题,但我希望复选框能够处理空值。 - Dave AlperovichBindingValue
是一个自定义类,其中包含用于在我们代码基础设施中创建绑定的属性。 - Rachel