我需要根据传递给它的模型创建一个包含控件的子窗口。例如,如果一个模型包含 5 个属性(它可以包含任意数量的属性)、2 个字符串类型、1 个日期时间和 2 个列表,它应该创建 2 个带有标签作为属性名称的文本框、1 个带有标签作为属性名称的日期选择器,以及2 个带有标签作为属性名称的组合框。基本上,控件应该根据属性以及作为属性名称的标签动态创建。我正在关注 MVVM。任何帮助将不胜感激。谢谢。
问问题
715 次
1 回答
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;}
}
第二步:数据模板
<DataTemplate TargetType="{x:Type sys:StringPropertyViewModel}">
<StackPanel Orientation="Horizontal">
<Label Text="{Binding Caption}" />
<TextBox Text="{Binding Value}" />
</StackPanel>
</DataTemplate>
第 3 步:确保 DataTemplates 位于窗口的 Resources 部分中,或者可以通过 ResourceDictionary 解析。
Step4:在窗口ViewModel中,暴露生成的PropertyViewModels
<Window...>
...
<ItemsControl ItemsSource="{Binding ModelPropertyViewModels}">
<ItemsControl.Resources>
<!-- This might be a good place to post your DataTemplates --->
<ItemsControl.Resources>
</ItemsControl>
...
</Window>
于 2013-07-12T09:37:31.743 回答