我有一个应用程序需要为每个类的属性显示输入表单。事情是,我不知道我在编译时正在处理哪个类,所以它需要是动态的。现在,我曾经在之前做到这一点的代码隐藏,如:使用MVVM模式创建UI元素
foreach (var P in TheType.GetProperties()){
this.ControlStackPanel.Children.Add(/.../)
// and so on
}
但是这一次我试图这样做纯MVVM模式,所以我不能使用代码隐藏。我的想法是通过构造函数将我的窗口实例注入ViewModel,但我被告知完全破坏了MVVM模式。
那么,关于如何做到这一点的任何想法?
听起来像你正在重新发明'PropertyGrid'。但我不明白这个问题。为什么它必须是“动态”的? ViewModel应该**不知道任何关于视图。 ViewModel **可以**准备一个视图用来生成子项的列表。纯MVVM - 将代码移入行为/转换器/等,但请不要将其移动到ViewModel中。 – Sinatr
“ViewModel可以准备一些东西将被视图用来生成儿童的列表。” 好的,我该怎么做?我是否准备了UIElements列表或仅列出了属性?该视图如何知道如何处理它?我该如何绑定到该列表? –
您不准备UI元素列表。但它可以是一个ViewModels列表 - ObservableCollection- ',其中'Item'包含所有必要的属性('Icon','Text',无论你需要什么)。该视图可以检查'Loaded'中的'DataContext'以获取ViewModel实例。然后,您可以将该集合绑定到“ItemsControl.ItemsSource”,并使用数据模板或模板选择器可视化这些(在数据模板中,您可以定义绑定到ViewModel的具体属性)。或者,如果您不介意非纯MVVM(我不这样做),请在视图中像您已经这样做,但使用该集合。 –
Sinatr