我有一个人物对象,其名称和年龄属性实现了INotifyPropertyChanged。我想将这个对象挂钩到一个ASP.NET表单,以便'name'和'age'属性以一种方式绑定到文本框,当在任一地方(在控件或对象中)发生更改时,另一个将得到更新。
我是否创建了一个中间类来监听每个文本框的更改事件,并且对象会更改事件并处理它们之间的更新?最好的方法是什么?
我不清楚如何让业务对象和UI相互通信。
答案 0 :(得分:2)
我已经对这个确切的问题进行了很多强调。
简短的回答是,中间项目。
诀窍是不为每个控件编写任何代码。您应该能够在屏幕上放置GUI控件(可能会也可能不会占用代码),然后通过通用绑定机制将业务逻辑绑定到它。
我已经通过XML,通过属性文件和通过常量数组定义了绑定 - 有一百万种方法......
您可能必须为每个绑定对象类型编写代码(列表框的绑定方式与文本控件不同),您可能必须编写验证程序(但是指定验证程序的参数以及验证程序绑定到哪个控件也应该完成在数据中)
现在所有这一切,如果一些数据驱动的自动绑定机制还没有存在,我会感到非常惊讶,微软自从VB首次问世以来就已经开始了(尽管他们的实现过去非常不灵活,我“我相信他们现在做得更好了。”
我非常坚持每个控件的0行代码,因为我的工作通常涉及使用几十页控件配置复杂设备。典型的客户端/服务器系统将具有7(!)行代码PER CONTROL,用于将数据从数据库传输到服务器,传输到客户端,再传输到屏幕并返回(这对于简单的“哑”代码来说是最小的没有聪明的绑定技巧)。
0LOC /控制可能不是每个人的要求,但这是一个很好的目标。
评论回复: 我已经用Java手动完成了我的大部分工作,所以我不确定我是否可以对这些细节提供太多帮助。
搜索C#和绑定给了我this看起来很有希望,虽然它可能直接绑定到IMO太多的数据库,它应该绑定到业务对象,但概念应该是相同的。
首先创建绑定的一种方法是手动实例化绑定对象...(请原谅我的Java)
TextControl textCtrl1=new TextControl("Name Goes Here");
new TextBinder(textCtrl1, personObject, nameField);
在Java中,第二行变得棘手。当您绑定到特定字段时,您必须使用反射来查找personObject的该字段的setter和getter。在C#中,我认为它应该更容易。
无论如何,绑定器应该将自己添加为控件和对象的侦听器,然后来回转发。
这对你有帮助吗?
EDIT2: 正如您所注意到的,当您的房产更新时,困难的部分会注意到。幸运的是,这是可选的。通常,一旦设置了对象,就不需要更新组件(当我分发可以相互更新的UI时,我不得不处理这几次。)
因此,如果您假设您的对象不会更改,则“绑定”必须执行以下操作:
从组件获取更新时: - 将值存储在属性中。 - 您可能需要设置“更新”标志或存储原件,以便在遍历所有绑定组件时,可以判断是否需要保存任何更新/启用“确定”按钮。
你的对象现在应该是最新的。
在构建表单时,您可能希望将所有绑定控件放入集合中,以便可以执行其他一些操作...
这样做的巧妙之处在于,您希望添加的每个“操作”都非常容易添加,但会自动影响整个UI。
您可能还需要一个带有抽象基础“绑定”类的控件的小对象层次结构,然后是每种控件类型的特定绑定器(文本字段,数字字段,日期,微调器,表格,下拉) - 我认为就是这个。
这可以非常简单,但会迅速增加复杂性。尝试使用文本字段,看看你能做些什么。如果您可以在C#...
中传递“属性”,那么简单的文本绑定对象应该就像5行代码答案 1 :(得分:0)
好的,完全单独的答案。正如我告诉你的那样,我对C#技术并不是最新的,但从我所听到的情况来看,LINQ可能会为你完成整个工作。
事实上,LINQ可能会完全按照你要做的去做。它在Java中不存在,所以这就是我在另一个答案中给你“手动”版本的原因。
本页底部的评论:http://msdn.microsoft.com/en-us/library/z919e8tw.aspx暗示了一种更好的方式。