绑定到嵌套属性的数据绑定 - 无法绑定属性或列(Winforms)

3
我们正在运行一个使用Windows Forms的.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中运行上述绑定时,我们会收到错误信息:
“发生错误:无法将DataSource的属性或列Message绑定。参数名称:dataMember”
然而,如果安装.NET 4.5,则可以解决此问题。
这是.NET 4.0的局限性、错误还是其他原因导致的呢?

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

4
您可以使用以下任一选项:
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");

Reza,你知道吗?我感到羞愧。 - Ivan Stoev
@IvanStoev 不知道问题是否已经在运行 .Net 4.5 的机器上解决,但我以前使用过这样的解决方法。对你的好答案点赞 :) - Reza Aghaei
@IvanStoev,我甚至无法在只有.Net 2.0的机器上重现这个问题!所以现在我不知道为什么会写出这样的代码,而 textBox1.DataBindings.Add(new Binding("Text", myObj, "c.Message")); 在只有 .Net 2.0 的机器上可以工作!我错过了什么吗? - Reza Aghaei
这有点神秘。不幸的是,我没有一台干净的机器,所以无法检查。但我很确定在我们开始使用.NET时它没有起作用 - 那是很久以前,但我记得那是在2.0之后(我们正在等待泛型)。OP似乎是一位经验丰富的开发人员,所以我相信他所说的话。无论如何,像往常一样,和你聊天很愉快!保重。 - Ivan Stoev

3
简短故事:Windows Forms数据绑定不支持属性路径,这就是为什么你会收到错误的原因。
直到今天我一直这样认为。但是,尝试您的代码后,我惊讶地发现它确实适用于.NET 4.5机器!因此看起来MS在某个时候添加了它-老实说,不知道何时。但是现在有了!无论如何,如果向后兼容性是一个问题,应避免使用该特性(尽管这将非常遗憾)。

如果微软也在 DataGridView 的 DataPropertyName 中添加了这个表单,我的日子就会更美好。 - Larry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接