Silverlight中的动态数据输入表单

时间:2010-01-26 08:33:22

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

我们正在研究如何从预定义字段定义的动态列表中创建数据条目视图。通过“预定义”,我的意思是只有8种基本字段类型。 Silverlight Toolkit的DataForm控件几乎是需要的,但它的目标是属性(不是自定义定义列表)。

是否有现有项目可以轻松实现这一目标?请评论我的设计理念(如下)。我只有~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 个答案:

答案 0 :(得分:2)

我强烈建议将DataForm类合并到您的解决方案中,它确实能够处理自定义控件。多年来我一直在追求理想的minimal-xaml数据形式的这个目标,我最终确定了我认为DataForm的内置功能和从DataField派生的自定义字段的完美结合。例如,我只是扩展了DataField,这样当没有指定Content属性时,它会自动使用TextBox来最大限度地缩短我的XAML时间。我还添加了对DisplayFormatAttribute的支持,DataForm似乎不支持本地。

无论如何,你可以先做的是创建一堆子类,如上所述,并从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事件并查找要在运行中使用的相应字段,或者您可以禁用自动字段生成,只需使用您自己的字段加载它。

答案 1 :(得分:0)

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