C# MVVM中的WPF动态面板创建

C# MVVM中的WPF动态面板创建,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在为对象实例层次结构创建一个编辑器。编辑器有一个面板,其子控件因对象的字段而异。因此,对于具有整数字段的类型A,它将具有微调器控件;对于具有字符串字段的类型B,它将具有文本框。等等 问题是,如何在MVVM中实现这一点 您可以在XAML代码中使用ContentControl,并绑定到某些类型(事件系统类型-您想要的): (YourProperty是附加到视图的ViewModel中的属性) 然后,您必须创建呈现视图的数据模板: <DataTemplate DataType="{x:Ty

我正在为对象实例层次结构创建一个编辑器。编辑器有一个面板,其子控件因对象的字段而异。因此,对于具有整数字段的类型A,它将具有微调器控件;对于具有字符串字段的类型B,它将具有文本框。等等


问题是,如何在MVVM中实现这一点

您可以在XAML代码中使用
ContentControl
,并绑定到某些类型(事件系统类型-您想要的):


(YourProperty是附加到视图的ViewModel中的属性)

然后,您必须创建呈现视图的数据模板:

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

系统和视图是xaml代码中的名称空间。在本例中,我使用system:int类型,但它可以是您的自定义类型
MyWindow
是一个
UserControl
对象,因此您基本上可以在解决方案中创建另一个WPF
UserControl
文件

它是这样工作的<代码>内容控件获取其
内容
并检查其类型。它查找可以将此类型转换为某些视图(可以是文本、文本框等)的
数据模板
,这些视图可以呈现为
内容


致以最诚挚的问候

您可以在XAML代码中使用
ContentControl
,并绑定到某些类型(事件系统类型-您想要的):


(YourProperty是附加到视图的ViewModel中的属性)

然后,您必须创建呈现视图的数据模板:

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

系统和视图是xaml代码中的名称空间。在本例中,我使用system:int类型,但它可以是您的自定义类型
MyWindow
是一个
UserControl
对象,因此您基本上可以在解决方案中创建另一个WPF
UserControl
文件

它是这样工作的<代码>内容控件获取其
内容
并检查其类型。它查找可以将此类型转换为某些视图(可以是文本、文本框等)的
数据模板
,这些视图可以呈现为
内容


致以最诚挚的问候

我不明白您在坚持什么,您只需检查字段的类型并在代码中相应地创建元素。@BenjaminGruenbaum我在代码隐藏中做这件事吗?在“普通”C#中很简单,但在MVVM中,我不能在ViewModel中编写像“new TextBox()”这样的东西。当然,你可以编写像
new Grid
这样的东西并附加它,就像在其他任何GUI环境中一样:)我会在大部分情况下使用XAML,只在C#代码后面生成动态元素。请注意,MVVM描述了如何在表示和业务逻辑之间分离关注点,而不是如何构建模板:)我不明白您的理解是什么,您只需检查字段的类型并在代码中相应地创建元素即可。@BenjaminGruenbaum我在代码隐藏中这样做吗?在“普通”C#中很简单,但在MVVM中,我不能在ViewModel中编写像“new TextBox()”这样的东西。当然,你可以编写像
new Grid
这样的东西并附加它,就像在其他任何GUI环境中一样:)我会在大部分情况下使用XAML,只在C#代码后面生成动态元素。请注意,MVVM描述了如何在表示和业务逻辑之间分离关注点,而不是如何构建模板:)+1它值得添加,使用DataTemplateSelector这可以进一步定制,例如,如果根据视图模型中属性的值需要不同的模板,+1它值得添加,使用DataTemplateSelector甚至可以进一步自定义此选项,例如,如果需要根据视图模型中属性的值使用不同的模板。