c# - 为什么在使用 WriteValue 更新 bool 绑定(bind)时会出现格式异常?

标签 c# data-binding binding .net-3.5

我的表单上有一堆复选框,它们的 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 会使异常消失:

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

WriteData 使用 reformat = trueforce = true 调用 PullData

从您的调用堆栈看来,您必须进入此 block :

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

紧接着,异常被重新抛出除非 FormattingEnabled = true。因此,在此处设置 FormattingEnabled 会隐藏问题,因为 Binding 似乎假定您将自行处理迄今为止发现的任何格式/解析问题。

至于为什么一开始就抛出异常……不知道。看这里没有什么是显而易见的:

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

如果您找到一种无需 BindingValue 自定义类即可添加数据绑定(bind)的方法,我很想知道您的问题是否仍然存在。如果您在 BindingValue 中连接了任何监听器,我也很好奇。

关于c# - 为什么在使用 WriteValue 更新 bool 绑定(bind)时会出现格式异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942249/

相关文章:

c# - Facebook C# SDK 获取用户语言/地区

c# - 如何在 WPF(MVVM/ Entity Framework )中更新表单时显示从数据库到 TextBlock 的外键数据值?

ScalaFX。实时绑定(bind)

wpf - 依赖属性和数据绑定(bind)?

java - 在启用 Spring 的 Velocity 模板内绑定(bind)变量集合

javascript - 复合可观察量条件的 knockout applyBindingsToNode 问题

c# - 在 C# 中操作 RichText 的更好方法?

c# - 具有不同当前文件夹的相对路径的绝对路径

javascript - C# MVC AJAX 请求

wpf - 如何设置用户控件的数据上下文