C# 根据绑定的viewmodel实例显示ui控件
在c#/wpf中,根据绑定的viewmodel在窗口中显示用户控件的最简单方法是什么?假设我有以下视图模型:C# 根据绑定的viewmodel实例显示ui控件,c#,wpf,mvvm,binding,interface,C#,Wpf,Mvvm,Binding,Interface,在c#/wpf中,根据绑定的viewmodel在窗口中显示用户控件的最简单方法是什么?假设我有以下视图模型: public interface ISomeInterface { string Name { get; set; } } public class A : ISomeInterface { public string Name { get; set; } public string Size { get; set; } public string Ag
public interface ISomeInterface
{
string Name { get; set; }
}
public class A : ISomeInterface
{
public string Name { get; set; }
public string Size { get; set; }
public string Age { get; set; }
}
public class B : ISomeInterface
{
public string Name { get; set; }
public string Address { get; set; }
public string Job { get; set; }
}
现在我想在UI上有一些控件,它们总是存在的(来自接口的控件),还有一些依赖于bindene模型(A
和B
)
在xaml中,最简单的方法是什么来决定是显示模型A
的控件还是显示模型B
的控件
还是这种做法不好
谢谢大家! 您可以使用
数据模板
,使用数据类型
属性
xmlns:MyViews="clr-namespace:My.Views.Namespace.Here"
xmlns:MyClasses="clr-namespace:My.Classes.Namespace.Here"
...
<DataTemplate DataType="{x:Type MyClasses:A}">
<MyViews:AView/>
</DataTemplate>
注意:如果需要,请不要忘记实现INotifyPropertyChanged
您的XAML将如下所示:
<ContentPresenter Content="{Binding MyThing}"/>
ContentPresenter
将自动拾取分配给数据类型A
的AView
,并相应地显示视图。这允许您将继承ISomeInterface
的任何内容放入MyThing
属性中,ContentPresenter
将更改其内容以匹配更改
在
ResourceDictionary
中定义这些DataTemplate
资源是一个好主意,似乎您希望继承基本UI的xaml,然后基于派生的viewmodels添加其他控件!!!有趣:)事实上,dataTemplate是@Mike.allowContentControl所示的方式。ContentTemplateSelector
是处理模板分配的另一种方式。感谢您的回答。在ResourceDictionary中定义DataTemplates非常清晰。但我不知道如何用ContentPresenter显示它们。是否可以将此信息添加到您的优秀示例中?@BendEg我已经编辑了我的答案,我希望这能澄清问题。好的,但是如果ISomeInterface
不是ViewModel的成员,该怎么办,但是ViewModel继承自它?ContentPresenter
将自动关闭并找到与类型关联的DataTemplate
。这是一个由彩虹和独角兽尘埃驱动的魔法控制,你不需要想太多。只要DataTemplate
在ContentPresenter
可以看到的地方,它就会使用它。
<ContentPresenter Content="{Binding MyThing}"/>