2013-07-12 69 views
0

我正在爲對象實例層次結構創建編輯器。編輯器有一個面板,其子控件根據對象的字段而有所不同。因此,對於具有整數字段的類型A,它將具有微調控制;對於具有字符串字段的類型B,它將具有文本框。等等。在MVVM中創建WPF動態面板

問題是,你如何在MVVM中實現這一點?

+0

我不明白你卡住了什麼,你只需檢查字段的類型並相應地在代碼中創建元素。 –

+0

@BenjaminGruenbaum我會在代碼隱藏方面做到這一點嗎?在「普通」C#中很簡單,但在MVVM中,我不能在ViewModel中編寫像「new TextBox()」之類的東西。 –

+0

當然,你可以寫'new Grid'之類的東西並附加它,就像你可以在其他所有的GUI環境中一樣:)我最大程度地使用XAML,並且只在後面的C#代碼中生成動態元素。請注意,MVVM描述瞭如何區分演示文稿和業務邏輯之間的關係 - 而不是您如何構建模板:) –

回答

3

您可以在XAML代碼NAD綁定使用ContentControl某種類型(事件系統類型 - 你想要什麼):

<ContentControl Content="{Binding YourProperty}"/> 

(YourProperty是你財產的ViewModel連接查看)

那麼你必須創建DataTemplate來渲染視圖:

<DataTemplate DataType="{x:Type system:int}"> 
    <views:MyWindow/> 
</DataTemplate> 

系統和視圖是你在xaml代碼中的命名空間。在這個例子中,我使用system:int類型,但它可以是你的自定義類型。 MyWindowUserControl對象 - 所以您基本上在您的解決方案中創建另一個WPF UserControl文件。

它的工作原理是這樣的。 ContentControl得到它的Content並檢查它的類型。它尋找DataTemplate,可以將此類型投射到某些View(它可以是文本,文本框等),可以呈現爲Content

問候函

+1

+1值得添加的是,使用DataTemplateSelector可以進一步自定義,例如,如果需要根據視圖模型中屬性的值。 – dowhilefor