Lightswitch:运行时的动态数据绑定

时间:2014-10-20 00:05:43

标签: c# data-binding runtime visual-studio-lightswitch

我想在运行时以编程方式生成自定义表单。我已经弄清楚如何通过从元数据中读取表单定义并在运行时将TextBox和DatePicker控件添加到通用屏幕中的StackPanel控件来生成Silverlight Lightswitch屏幕。我还希望将这些控件绑定到数据源,以便可以自动读取表单数据并将其保存到数据库,而无需我做太多工作。

我的问题是如何在运行时设置数据源并将控件绑定到它? Lightswitch可以很好地隐藏它为UI设计的屏幕完成此操作的方式。我已经在线进行了几个小时的研究,试图找到答案。

1 个答案:

答案 0 :(得分:1)

说实话,我认为你要求的是一些无法真正做到的事情。

我确信有些技术可以促进您所追求的动态绑定数据模型(我已经看到类似于Visual Basic 6.0编写的类似内容 - 但该解决方案在数据访问时遇到数据访问性能问题开始扩大规模)。 LightSwitch和VB 6.0之间的区别在于VB 6.0允许您动态构建屏幕并在运行时修改数据绑定 - 这得益于VB6.0应用程序的后期限制 - 它们具有预先的传统.net VB作为运行时解释器运行。 LightSwitch的输出是.Net MSIL编译 - 特别是在服务器端。尽管该代码仅编译为MSIL,而不是汇编语言或机器代码,但它是强类型和早期绑定的。

LightSwitch在编译时针对服务层执行数据绑定,方法是生成基于T4模板的代码,这些代码针对各个.LSML文件中的数据和屏幕模型运行,并根据需要使用附加的代码隐藏/附加JavaScript扩展基类。除非您正在动态生成服务,否则我不会看到LightSwitch如何将屏幕(在这种情况下很容易)绑定到运行应用程序时不存在的服务。

您还应注意,LightSwitch通常希望数据模型中的实体是强类型的。即使您能够创建将键值对(即字典对象)实体转换为看起来像为CRUD操作公开的强类型表格数据集的服务,数据访问的性能也会非常糟糕,并且没有为仲裁外键,唯一约束,表连接等优化的数据库...... ugh 我看不到它像关系数据库一样高效。某种NoSQL数据库可能会提高性能,但是您需要一种服务,将LightSwitch LINQ转换为Entities查询到特定于平台的map-reduce操作。

我并不是说你要求的东西不能以任何绝对的方式完成。如果要将屏幕数据组合为可以写入SQL Server表中的XML类型列的XML文档,那么这可能是可行的。为了实现这一点,您可能需要包含某种引用XML模式文档(或对包含XML类型的此类引用XSD的表的外键),以便能够根据需要解包您的屏幕文档。

但是,我认为Silverlight不是基于这些XSD构建屏幕的最佳技术,或者是数据绑定数据存储层与暴露这种以XML为中心的数据模型的服务。您甚至可以将此过程烘焙到屏幕模板中,但最终Silverlight的类型过于强烈,并且针对早期绑定进行了优化。 HTML客户端会更有意义,因为您可以在为屏幕发出HTML时截取create()事件,并使用before_ApplyChanges()屏幕事件将屏幕数据序列化为XML以通过网络传输。但是,你要做的就是有效地替换除了CSS之外LightSwitch发出的所有东西。

在我看来,你最好用ASP.NET MVC应用程序这样做,因为你可以围绕KVP架构构建模型,构建视图模板,有效地将XSLT转换应用到XML模式/数据到做你需要的繁重工作,你不会在生成的屏幕和动态数据模型之间有额外的代码层(即LightSwitch的管道)。动态(屏幕)到动态(数据)要简单得多,并且比看起来更像动态(屏幕)到强类型(Silverlight屏幕管道)到更强类型(实体服务模型)到动态类型的解决方案更有效( XML存储)。

请记住,存在强类型存在的原因。它表现很好。它得到了结果。如果您有一套明确的业务需求,绝对只能通过动态表单和数据提供,请查看使用针对该模式优化的解决方案体系结构。 IMO,LightSwitch(记住 - 使用生成代码的早期绑定)不是您正在寻找的架构。 挥手,发挥绝地精神控制:)