视图中的多个数据上下文

4

我曾试图在帖子中寻找答案,但尚未找到(至少在我对WPF还不是很熟悉的情况下)。

我在视图构造函数中定义了一个数据上下文:

this.DataContext = viewModel;

如果可能的话,我希望在单个视图中使用多个数据上下文?我听到了其他人对此的多种不一致回答。目标是我需要访问多个视图模型中的属性。例如,我的视图XAML用于如下所示的情况:

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

如果我可以明确地引用适当视图模型中的每个属性,那就太好了。

注意:基于窗口的多个视图模型被叠加在主窗口中。它们根据用户进行向导式选择而变为活动状态。

1个回答

16

我发现最简单的解决方案是有一个ViewModel,它将其他ViewModel作为属性保存。然后视图可以从所有不同的ViewModel中访问它所需要的属性...

举个例子,你可以有一个VMContainer:

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

现在请设置您的DataContext为一个VMContainer实例,其中您已经设置了特定的VM属性...

然后您可以在XAML中执行以下操作

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

值得注意的是,您不必为此创建全新的VMContainer类。如果根据您的VM表示方式来看,为其他VM添加新属性也是可行/合理的。


我喜欢这个解决方案!我之前不知道在绑定中可以使用<VM#>.<some property>。我一直在考虑将阴影属性放在容器中,只是引用其他VM中感兴趣的属性。谢谢!Buck - Buck
这是一个非常好的解决方案。感谢Blachshma! - Levi Fuller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接