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