我的表单上有一堆复选框,它们的 Checked 属性绑定(bind)到数据模型上的 bool 属性:
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))
还有一个用于屏幕上所有复选框的共享事件处理程序,可确保数据绑定(bind)值正确设置为选中的值。
private void AllCheckboxes_CheckedChanged(object sender, EventArgs e)
{
var chk = ((CheckBox)sender);
var binding = chk.DataBindings["Checked"];
if (binding != null)
binding.WriteValue();
}
在某些情况下,第一次加载此表单和绑定(bind)时,我会遇到异常:
Cannot format the value to the desired type.
at System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component, Object value) at System.Windows.Forms.BindToObject.SetValue(Object value) at System.Windows.Forms.Binding.PullData(Boolean reformat, Boolean force) at System.Windows.Forms.Binding.WriteValue()
第一个复选框正确处理事件,但第二个复选框将抛出此异常。
数据源是我的数据模型的接口(interface)
public interface IMyDataModel
{
bool MyBooleanProperty1 { get; set; }
bool MyBooleanProperty2 { get; set; }
bool MyBooleanProperty3 { get; set; }
}
而且我可以通过在事件处理程序中的 .WriteValue 之前设置一个断点来验证数据模型本身是否设置正确。我什至可以在绑定(bind)的 bool 属性的 setter 中放置一个断点,它也被正确调用。
如果我将绑定(bind)的 FormattingEnabled
属性设置为 true,它确实可以解决问题。但我想知道为什么我一开始就必须这样做,因为我将 UI 对象中的 System.Boolean
属性绑定(bind)到数据的 bool
属性来源。
为什么在这种情况下我会得到这个异常?
最佳答案
如果没有重现问题的方法,很难确定发生了什么。
但至少我可以解释为什么设置 FormattingEnabled
会使异常消失:
WriteData
使用 reformat = true
和 force = true
调用 PullData
。
从您的调用堆栈看来,您必须进入此 block :
// Put the value into the data model
if (!parseFailed) {
this.bindToObject.SetValue(parsedValue);
}
紧接着,异常被重新抛出除非 FormattingEnabled = true
。因此,在此处设置 FormattingEnabled
会隐藏问题,因为 Binding
似乎假定您将自行处理迄今为止发现的任何格式/解析问题。
至于为什么一开始就抛出异常……不知道。看这里没有什么是显而易见的:
如果您找到一种无需 BindingValue
自定义类即可添加数据绑定(bind)的方法,我很想知道您的问题是否仍然存在。如果您在 BindingValue
中连接了任何监听器,我也很好奇。
关于c# - 为什么在使用 WriteValue 更新 bool 绑定(bind)时会出现格式异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942249/