【问题标题】:Dynamic data-entry forms in SilverlightSilverlight 中的动态数据输入表单
【发布时间】:2010-01-26 08:33:21
【问题描述】:

我们正在研究如何从预定义字段定义的动态列表创建数据输入视图。 “预定义”是指只有 8 种基本字段类型。 Silverlight Toolkit 的 DataForm 控件几乎是我们想要的,但它针对对象 properties(不是自定义定义列表)。

是否有现有的项目可以简化此操作?请评论我的设计理念(下)。我只有大约 2 周的 Silverlight 经验。

基本设计理念:

我正在考虑定义自定义数据字段类型。 UI 将接收 IEnumerable<BaseDataField> 并枚举,并根据每个字段的类型创建控件。每个字段将创建一个带有描述的标签,BooleanDataField 将创建一个 CheckBox,LookupDataField 将创建一个 ComboBox,等等。

阐明思路的伪代码:

public abstract class BaseDataField {
    public string FieldCode { get; private set; }
    public string FieldDescription { get { return FieldDefinitions.Instance.FieldDescription(FieldCode); } }
    ...
}

public class StringDataField : BaseDataField
public class BooleanDataField : BaseDataField
public class CurrencyDataField : BaseDataField
public class IntegerDataField : BaseDataField
public class NumericDataField : BaseDataField
public class DateTimeDataField : BaseDataField
public class LookupDataField : BaseDataField
public class SpecialDataField : BaseDataField

这将被扩展以使字段可绑定;允许为每种类型指定自定义控件;并获得验证反馈。

是否可以在 Silverlight 中轻松完成,还是我们应该创建一个自定义控件?

注意:该程序将是现有多层 LOB 平台的 Web UI。所有数据都从基于 JSON 的 REST 服务序列化。

谢谢!

【问题讨论】:

  • 您说您只有 2 周的 Silverlight 经验,但您有多少 .NET 经验?它往往翻译得很好。我建议将abstract public Type FieldType { get; } 添加到BaseDataField,因为这可能是有用的信息。
  • 我有 2-3 年的 .NET 2.0 经验和 MCPD。 XAML、Silverlight 控件和绑定模型对我来说非常陌生。感谢您的建议。

标签: c# wpf silverlight dynamic-controls data-entry


【解决方案1】:

我强烈建议将 DataForm 类合并到您的解决方案中,它确实能够处理自定义控件。多年来,我一直在追求理想的最小 xaml 数据表单的目标,我最终确定了我认为 DataForm 的内置功能和从 DataField 派生的自定义字段的完美结合。例如,我只是扩展了 DataField,以便在未指定 Content 属性时,它会自动使用 TextBox,从而最大限度地减少我的 XAML 时间。我还添加了对 DataForm 本身不支持的 DisplayFormatAttribute 的支持。

无论如何,您首先可以做的是创建一堆如上所述的子类,并从 DataField 派生。然后在 OnApplyTemplate 方法中,创建一个元素来表示数据。例如:

class BooleanDataField : DataField {

    protected override void OnApplyTemplate() {

        if (this.Content == null) {
            var check = new CheckBox();
            check.SetBinding(CheckBox.IsCheckedProperty, 
                new Binding(this.PropertyPath));
            this.Content = check;
        }

        base.OnApplyTemplate();
    }

}

至于如何让 DataForm 加载您的字段元数据,您有几个选择。您可以处理 AutoGeneratingField 事件并即时查找要使用的适当字段,或者您可以禁用自动字段生成并使用您自己的加载它。

【讨论】:

  • 是否可以使用自动生成字段的动态列表?我们有一个工具允许用户创建自定义字段并将其链接到产品。 DataForm.GenerateFields() 似乎只从复杂类型属性生成字段。谢谢你的推荐。我将调查带有绑定的手动 DataForm 填充,并将您的答案标记为已接受(如果有效)。
  • 这个选项看起来很有趣,我很想看看它是如何组合在一起的。
【解决方案2】:

我们从 DataForm 开始,但最终覆盖了使它有用的所有内容,但仍然存在一些问题。我从这次尝试中学到了很多东西,并最终为这项工作构建了一个自定义控件。不幸的是,这个解决方案不是很可扩展......

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 2017-01-06
    • 2021-11-04
    • 2019-01-24
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多