我正在计划一个
的WPF应用程序以下是我计划如何进行的:在客户数据输入视图中,我将设置数据上下文:
<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>
答案 0 :(得分:7)
您必须为各种字段数据类型编写数据模板,以便WPF根据其类型选择如何显示数据。这种格式的东西:
注意:这不是WPF,只是伪代码
<DataTemplate DataType="{x:Type DateTime}">
<DatePicker Value="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type String}">
<TextBox Text="{Binding}"/>
</DataTemplate>
它不一定是原始类型。它可以是Email
,DateApproved
甚至是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控件的更改来更新数据对象。然后,您可以在用户保存时将更改应用于数据库。