如何在WPF应用程序中构建动态数据输入表单?

时间:2009-04-24 13:46:38

标签: wpf mvvm

我正在计划一个

的WPF应用程序
  • 能够创建动态数据录入表单(意味着表单会从数据库中的数据中获取要显示的字段,顺序等,而不是来自XAML)
  • 尽可能使用MVVM模式

以下是我计划如何进行的:在客户数据输入视图中,我将设置数据上下文:

<UserControl.DataContext>
    <vm:DynamicFormViewModel/>
</UserControl.DataContext>

然后在我的XAML中包含一个元素作为表单的占位符:

<UserControl.Content>
    <view:DynamicFormView x:Name="CustomerEntry"/>
</UserControl.Content>

然后在我的ModelView中我想要没有静态属性,但我希望以这种方式将XAML构建为ASP.NET中的一个构建的HTML控件:

View view = new View();
view.Children.Add(...)

以这种方式构建Grid,它基于ViewModel从Model中获取的数据(firstname,lastname)和元数据(字段标签,字段名称,字段帮助文本,字段显示顺序等)的集合。 / p>

  • 是否有人构建了可以这种方式创建动态表单的WPF应用程序?
  • 你使用MVVM模式吗?
  • 是否可以以这种方式使用MVVM模式,或者MVVM模式是否预先假定视图模型中的静态字段直接绑定到视图中的静态元素?

2 个答案:

答案 0 :(得分:7)

您必须为各种字段数据类型编写数据模板,以便WPF根据其类型选择如何显示数据。这种格式的东西:

注意:这不是WPF,只是伪代码

<DataTemplate DataType="{x:Type DateTime}">
  <DatePicker Value="{Binding}"/>
</DataTemplate>  
<DataTemplate DataType="{x:Type String}">
  <TextBox Text="{Binding}"/>
</DataTemplate>

它不一定是原始类型。它可以是EmailDateApproved甚至是Url类类型。 e.g。

class Customer  
{
   public Email Email{get;set;}
   public DateTime DateApproved{get;set;}
   public URI Url{get;set;}
}

public class Email 
{
   public string Type{get;set;}
   public string Value{get;set;} 
} 

...等...

<强>更新

在MSDN上查看此WPF动态UI示例:Dynamic Data Entry with WPF and LINQ

答案 1 :(得分:1)

您需要为每个字段类型设置DataTemplate,例如Date,String,Bool。这将决定每个字段的显示方式。

然后,您可以使用列进行数据库查询以生成对象列表并将它们放入ItemsControl。

ObservableCollection<ColumnDef> columns = new ObservableCollection<ColumnDef>();

// Add columns from DB
columns.Add(new StringColumnDef{Object=..., Field=..., Label=..., Value=...});
columns.Add(new DateColumnDef{Object=..., Field=..., Label=..., Value=...});

items.ItemsSource = columns; // items is an ItemsControl

项目控件中的每个项目都将根据该类型的DataTemplate显示。

在ColumnDef中,您可以使用Reflection通过UI控件的更改来更新数据对象。然后,您可以在用户保存时将更改应用于数据库。