0

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

4

1 回答 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 回答