生成TextBoxes以填写类

时间:2015-03-20 20:54:25

标签: c# wpf mvvm

我有几个需要填写属性的类。例如:

class RecordType1
{
    public DateTime Date { get; set; }
    public string Name { get; set; }
    public string Value { get; set;}
}

class RecordType2
{
    public DateTime Date { get; set; }
    public string Name { get; set; }
    public string Location { get; set; }
    public float Temperature { get; set; }
}

对于RecordType1,我想生成DatePicker以填写日期,并生成两个TextBox以填充NameValue。同样,对于RecordType2,我想要DatePickerTextBox Name,位置, and温度`。

我可以为每个类创建一个包含单独UserControl的文件,该文件具有所需的TextBlocks和TextBoxes,但似乎可以有更好的方法来生成表单供用户填写。

这种事情有可能吗?

3 个答案:

答案 0 :(得分:0)

在WinForms中执行此操作的快速方法是使用PropertyGrid控件。我不确定WPF中是否存在等效内容,但您可以host the PropertyGrid使用WindowsFormsHost进行控制。

答案 1 :(得分:0)

可以通过反射来做到这一点。首先得到类型:

Type typeinfo = typeof(RecordType1);

然后您可以遍历属性。

如果您不想自己完成所有这些操作,可以使用超级属性。

<UserControl x:Class="Interstone.Bestelbonnen.Views.DrawingPropertiesControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:vm="clr-namespace:Interstone.Bestelbonnen.ViewModels"
         xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<xctk:PropertyGrid SelectedObject="{Binding}" AutoGenerateProperties="False" IsCategorized="False">
</xctk:PropertyGrid>           

有关propertygrid的更多信息: http://wpftoolkit.codeplex.com/wikipage?title=PropertyGrid

我没有详细说明反射部分,我不确定你想去哪个方向。

答案 2 :(得分:0)

即使在运行时,它肯定可以可能来做你要求的事情。您可以使用反射来获取各种字段,然后生成控件以匹配字段类型。

现在,这不是一个非常实用的方法,特别是考虑到这种生成的表单布局可能很糟糕的可能性很高。通常的方法是手动创建表单/用户控件。

由于您使用的是WPF,因此您可以使用数据模板而不是用户控件,因为您可以在ItemsControlContentControl中轻松使用它们