我有一个wpf-mvvm应用程序。
我有一个基类 - baseViewModel ...
和另外两个继承此基类的类
class aVM : baseViewModel
{
public string a {get;set;}
}
class bVM : baseViewModel
{
public string b {get;set;}
}
另一个类 - 作为主视图模型 - 绑定到主视图。
Class MainVM
{
public baseViewModel CurrentViewSource {get;set;}
}
同样在XAML文件(视图)中 - 我有两个用户控件。但是这两者的数据上下文是相同的公共属性 - CurrentViewSource - 这是类型 - baseViewModel。
<---MainView start DataContext="MainVM" ----->
<---user control 1 satrt----->
<--DataContext = "CurrentViewSource " -->
// Here CurrentViewSource is of type aVM
<---user control 1 end ----->
<---user control 2 start----->
<-- DataContext = "CurrentViewSource " -->
// Here CurrentViewSource is of type bVM
<---user control 2 end----->
<---MainView end----->
我需要一次显示一个用户控件......以及隐藏的其他用户控件。
由于两个用户控件(UC)都使用相同的数据上下文变量“CurrentViewSource”,
如果UC1可见(UC2隐藏) - CurrentViewSource将是类型aVM ...和UC2(即使隐藏)..使用它作为datacontext ..并且不能看到字符串b。
... Visual Studio显示了一些绑定问题。请帮帮我
答案 0 :(得分:2)
将ContentPresenter
与隐式Data Templates结合使用。
因此,在您的主视图中,您将显示一个或另一个用户控件,使用ContentPresenter并将其Content
属性绑定到CurrentViewSource
:
<ContentPresenter Content="{Binding CurrentViewSource}"/>
现在,对于每个支持的视图模型类型,在主视图的资源中定义DataTemplate
:
<Window ...>
<Window.Resources>
<DataTemplate DataType="{x:Type my:aVM}">
<my:aUserControl/>
</DataTemplate>
<DataTemplate DataType="{x:Type my:bVM}">
<my:bUserControl/>
</DataTemplate>
</Window.Resources>
...
<ContentPresenter Content="{Binding CurrentViewSource}"/>
...
</Window>
这样,只要更改CurrentViewSource
,就会应用相应的DataTemplate
。