我有一個應用程序需要爲每個類的屬性顯示輸入表單。事情是,我不知道我在編譯時正在處理哪個類,所以它需要是動態的。現在,我曾經在之前做到這一點的代碼隱藏,如:使用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