我正在爲對象實例層次結構創建編輯器。編輯器有一個面板,其子控件根據對象的字段而有所不同。因此,對於具有整數字段的類型A,它將具有微調控制;對於具有字符串字段的類型B,它將具有文本框。等等。在MVVM中創建WPF動態面板
問題是,你如何在MVVM中實現這一點?
我正在爲對象實例層次結構創建編輯器。編輯器有一個面板,其子控件根據對象的字段而有所不同。因此,對於具有整數字段的類型A,它將具有微調控制;對於具有字符串字段的類型B,它將具有文本框。等等。在MVVM中創建WPF動態面板
問題是,你如何在MVVM中實現這一點?
您可以在XAML代碼NAD綁定使用ContentControl
某種類型(事件系統類型 - 你想要什麼):
<ContentControl Content="{Binding YourProperty}"/>
(YourProperty是你財產的ViewModel連接查看)
那麼你必須創建DataTemplate來渲染視圖:
<DataTemplate DataType="{x:Type system:int}">
<views:MyWindow/>
</DataTemplate>
系統和視圖是你在xaml代碼中的命名空間。在這個例子中,我使用system:int類型,但它可以是你的自定義類型。 MyWindow
是UserControl
對象 - 所以您基本上在您的解決方案中創建另一個WPF UserControl
文件。
它的工作原理是這樣的。 ContentControl
得到它的Content
並檢查它的類型。它尋找DataTemplate
,可以將此類型投射到某些View
(它可以是文本,文本框等),可以呈現爲Content
。
問候函
+1值得添加的是,使用DataTemplateSelector可以進一步自定義,例如,如果需要根據視圖模型中屬性的值。 – dowhilefor
我不明白你卡住了什麼,你只需檢查字段的類型並相應地在代碼中創建元素。 –
@BenjaminGruenbaum我會在代碼隱藏方面做到這一點嗎?在「普通」C#中很簡單,但在MVVM中,我不能在ViewModel中編寫像「new TextBox()」之類的東西。 –
當然,你可以寫'new Grid'之類的東西並附加它,就像你可以在其他所有的GUI環境中一樣:)我最大程度地使用XAML,並且只在後面的C#代碼中生成動態元素。請注意,MVVM描述瞭如何區分演示文稿和業務邏輯之間的關係 - 而不是您如何構建模板:) –