【问题标题】:Databinding to nested property - Cannot bind property or column (Winforms)数据绑定到嵌套属性 - 无法绑定属性或列(Winforms)
【发布时间】:2015-11-18 20:18:27
【问题描述】:

我们正在使用 Windows 窗体运行 .NET 4.0 应用程序。该应用程序对两种不同类型的对象使用一个表单。

namespace NetIssue
{
    public partial class Form1 : Form
    {
        B myObj;
        public Form1()
        {
            InitializeComponent();

            myObj = new B();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.DataBindings.Add(new Binding("Text", myObj, "c.Message"));
        }
    }

    public class Comment {
        public int ID { get; set; }
        public string Message { get; set; }

        public Comment(string msg)
        {
            Message = msg;
        }
    }

    public class A {
        string MyName = "";
    }

    public class B : A {
        public Comment c { get; set; }

        public B()
        {
            c = new Comment("test");
        }
    }
}

当上面的绑定在 .NET 4.0 中运行时,我们得到错误

发生错误:无法绑定到属性或列消息 数据源。参数名称:dataMember

但是,如果我们安装 .NET 4.5,这个错误就会消失。

这是 .NET 4.0 的限制、.NET 4.0 中的错误,还是其他原因?

【问题讨论】:

  • 您的类中没有任何属性 - 只有字段。
  • @IvanStoev 抱歉,实际代码使用属性。我相应地更新了示例代码。我无法复制/粘贴代码,因为它可能会泄露有关项目的信息。我现在正在构建一个完整的可重现样本。
  • 另一件要提的事情(除了extends,我猜是:) - 类B 没有属性Message 并且WF 不支持像WPF 这样的属性路径(你不能使用“c.Message”)
  • @IvanStoev 这就是我尝试重写示例代码的结果。 (我不记得扩展关键字来自我脑海中的哪种语言。也许是 PHP。)我将代码更新为工作代码。如果您在安装了 .NET 4.5 的机器上运行代码,它就会工作。如果你在 .NET 4.0 机器上运行它,它会给你一个 .NET 错误。
  • 我明白了。其实我今天从你那里学到了一些东西!我很确定不支持属性路径,但看起来他们稍后添加了该支持。所以可能这就是你所说的限制。要验证这一点,请在 .NET 4.0 机器上尝试 textBox1.DataBindings.Add(new Binding("Text", ((B)myObj).c, "Message"));(不幸的是我现在没有这样的可用)

标签: c# .net winforms data-binding .net-4.0


【解决方案1】:

您可以使用以下任一选项:

B myObj = new B();
textBox1.DataBindings.Add(new Binding("Text", ((B)myObj).c, "Message"));

或者

var bs = new BindingSource(myObj, null);
textBox1.DataBindings.Add("Text", bs, "c.Message");

或者

textBox1.DataBindings.Add("Text", new B[] { myObj }, "c.Message");

【讨论】:

  • 雷扎,你知道吗?我很惭愧。
  • @IvanStoev 不知道该问题已针对运行 .Net 4.5 的机器解决,但我之前使用过这种解决方法。 +1 你的好答案:)
  • @IvanStoev 我什至无法在只有 .Net 2.0 的机器上重现该问题!所以现在我不知道为什么在textBox1.DataBindings.Add(new Binding("Text", myObj, "c.Message")); 只在.Net 2.0 的机器上工作时编写这样的代码!我错过了什么吗?
  • 这有点神秘。不幸的是我没有干净的机器,所以无法检查。但我很确定当我们开始使用 .NET 时它不起作用 - 很久以前,但我记得那是在 2.0 之后(我们正在等待泛型)。 OP 似乎是一位经验丰富的开发人员,所以我相信他说的话。无论如何,像往常一样,很高兴与您交谈!保重。
【解决方案2】:

简短的故事:Windows 窗体数据绑定不支持属性路径,这就是您收到错误的原因。

嗯,这就是我直到今天的想法。但是尝试您的代码时,我很惊讶它确实可以在 .NET 4.5 机器上运行!所以看起来 MS 在某个时候添加了这一点 - 老实说,不知道什么时候。但它现在就在那里!无论如何,如果担心向后兼容性,应该避免使用该功能(尽管会很遗憾)。

【讨论】:

  • 如果微软也将它添加到 DataGridView 的 DataPropertyName 中,我会过得更好。
猜你喜欢
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2012-07-19
  • 2011-10-08
  • 2012-07-23
  • 1970-01-01
  • 2011-10-20
  • 2012-06-15
相关资源
最近更新 更多