Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据绑定的viewmodel实例显示ui控件_C#_Wpf_Mvvm_Binding_Interface - Fatal编程技术网

C# 根据绑定的viewmodel实例显示ui控件

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

在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 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.allow
ContentControl所示的方式。ContentTemplateSelector
是处理模板分配的另一种方式。感谢您的回答。在ResourceDictionary中定义DataTemplates非常清晰。但我不知道如何用ContentPresenter显示它们。是否可以将此信息添加到您的优秀示例中?@BendEg我已经编辑了我的答案,我希望这能澄清问题。好的,但是如果
ISomeInterface
不是ViewModel的成员,该怎么办,但是ViewModel继承自它?
ContentPresenter
将自动关闭并找到与类型关联的
DataTemplate
。这是一个由彩虹和独角兽尘埃驱动的魔法控制,你不需要想太多。只要
DataTemplate
ContentPresenter
可以看到的地方,它就会使用它。
<ContentPresenter Content="{Binding MyThing}"/>