【问题标题】:Multiple Data Contexts in View视图中的多个数据上下文
【发布时间】:2013-02-23 07:16:46
【问题描述】:

我已经尝试了几次在帖子中找到答案,但还没有找到(至少在我对 WPF 相当陌生的情况下)。

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

this.DataContext = viewModel;

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

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

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

注意:有多个基于覆盖在主窗口中的窗口的视图模型。它们会根据用户做出的类似向导的选择而激活。

【问题讨论】:

    标签: c# wpf xaml binding wpf-controls


    【解决方案1】:

    我发现的最简单的解决方案是让一个 ViewModel 将其他 ViewModel 保存为Properties。然后 View 可以从所有不同的 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 所代表的内容)

    【讨论】:

    • 我喜欢这个解决方案!我不知道我可以在绑定中执行 .。我正在考虑将影子属性放在容器中,这只会引用其他 VM 中感兴趣的属性。谢谢!!巴克
    • 这样一个甜蜜的解决方案。谢谢 Blachshma!
    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多