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