根据数据类型WPF动态添加控件

时间:2013-07-12 09:21:12

标签: wpf mvvm wpf-controls

我需要根据传递给它的模型创建一个应该包含控件的子窗口。例如,如果一个模型包含5个属性(它可以包含任意数量的属性),2个类型字符串,1个日期时间和2个列表,它应该创建2个文本框,标签为属性名称,1个Datepicker,标签为属性名称,以及2个组合框,标签为属性名称。基本上,应根据属性动态创建控件,并将Label作为属性的名称。我正在关注MVVM。任何帮助将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

获取模型的PropertyInfos列表并将其包装在ViewModels中。然后使用DataTemplates和隐式键来生成控件。

Step1:获取PropertyInfoViewModels

var vms = model.GetType().GetAllProperties.Select(p=> ViewModelFactory.Create(p));

您的工厂应该为字符串属性等返回StringPropertyViewModel。

abstract class PropertyViewModel<T> : INotifyPropertyChanged
{
   public string Caption {get; set;}
   public T Value {get; set;}
}

第2步:DataTemplates

<DataTemplate TargetType="{x:Type sys:StringPropertyViewModel}">
   <StackPanel Orientation="Horizontal">
    <Label Text="{Binding Caption}" />
    <TextBox Text="{Binding Value}" />
   </StackPanel>
</DataTemplate>

第三步: 确保DataTemplates位于Window的Resources部分,或者可以通过ResourceDictionary解析。

步骤4: 在ViewModel窗口中,公开生成的PropertyViewModels

<Window...>
...
   <ItemsControl ItemsSource="{Binding ModelPropertyViewModels}">
    <ItemsControl.Resources>
     <!-- This might be a good place to post your DataTemplates --->
    <ItemsControl.Resources>
   </ItemsControl>

...
</Window>