如何隐藏用户控件获取datacontext?

时间:2011-02-22 17:59:01

标签: wpf mvvm

我有一个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显示了一些绑定问题。请帮帮我

1 个答案:

答案 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