2013-03-07 38 views
4

我已经尝试了几次在帖子中找到一个答案,但没有找到(至少在我的理解,因为相当新的WPF)。在视图中的多个数据上下文

我定义视图构造数据上下文:

this.DataContext = viewModel; 

我想如果可能的单一视图中使用多个数据上下文?我从其他人那里听到过多个不一致的答案。目标是我需要访问多个视图模型中的属性。例如我的观点XAML是如下这样的情况下使用:

<MultiBinding Converter="{StaticResource multiBooleanToVisibilityConverter}"> 
       <Binding Path="ResultControlsVisibileByDefault" UpdateSourceTrigger="PropertyChanged"/> 
       <Binding Path="StarWidthValueList.Count" UpdateSourceTrigger="PropertyChanged"/> 
      </MultiBinding> 

这将是巨大的,如果我可以明确地引用在适当的视图模型每个属性。

注意:有多个基于窗口的视图模型覆盖在主窗口中。它们基于用户所做的向导式选择而变得活跃。

回答

15

我找到的最简单的解决方案是有一个ViewModel,其他ViewModel保存为Properties。然后在视图可以访问他从所有不同的ViewModels想要的属性...

为了举例说明,你可以有一个VMContainer:

public class VMContainer 
{ 
    public FirstViewModel VM1 { get; set; } 
    public SecondViewModel VM2 { get; set; } 
} 

现在,在您的视图设置您DataContextVMContainer的实例你已经设置的特定虚拟机性能在...

然后,你可以做这样的事情在XAML

<Textbox Text="{Binding VM1.SomePropertyInFirstViewModel}" /> 
<Textbox Text="{Binding VM2.SomePropertyInSecondViewModel}" /> 

值得注意的是,你不需要已有为此创建一个全新的VMContainer类。你也可以在现有虚拟机中为其他虚拟机添加一个新的属性(如果可能/逻辑基于虚拟机代表的内容)

+0

我喜欢解决方案!我不知道我可以在绑定中做。我正在考虑将影子属性放在容器中,它只会引用其他虚拟机中感兴趣的属性。谢谢!!巴克 – Buck 2013-03-08 19:55:28

+0

这样一个甜蜜的解决方案。感谢Blachshma! – 2014-11-09 00:44:54

+0

谢谢你的这个例子! – curiousity 2015-05-28 14:15:35