在父视图中设置所有子视图的datacontext

时间:2014-06-02 12:37:28

标签: c# wpf xaml

我有一个

形式的XAML文件

CTC.XAML

<UserControl x:Class="KPI.CTC.UI.CTC"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:uc="clr-namespace:KPI.CTC.UI"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <TabControl Grid.Row="1">
        <TabItem Header="Industry">
            <uc:Industry DataContext="{}"/>
        </TabItem>

        <TabItem Header="Templates">
            <uc:Templates DataContext="{}"/>
        </TabItem>

        <TabItem Header="Item Calcs">
            <uc:ItemCalcs DataContext="{}"/>
        </TabItem>
    </TabControl>
</UserControl>

其中Industry.xamlTemplates.xamlItemCalcs.xaml各自的ViewModel位于单独的命名空间KPI.CTC.ViewModel中。我想知道是否可以仅在DataContext中设置所有3个视图的CTC.xaml。我不想执行单独为单个视图设置DataContext的繁琐任务。

提前致谢!!

2 个答案:

答案 0 :(得分:1)

如果您查看MSDN上的FrameworkElement.DataContext“属性”页面,您应该会看到名为依赖项属性信息的部分:

enter image description here

这告诉我们DataContext DependencyProperty的{​​{1}}值为FrameworkPropertyMetadata,这意味着Inherits属性将自动由子控件继承。因此, if 你想要将所有子控件的DataContext设置为与父控件相同的值,那么这会自动发生,但这是唯一的情况发生。

因此,除非您的情况如上所述,否则您将不得不在某处编写代码......唯一的问题是在哪里。也许最简单的方法是使用DataContext,尽管这只有在为每个用户控件绑定不同类型对象的实例的数据时才有效。尝试将这些DataTemplate添加到DataTemplate

Application.Resources

使用此方法将使您无需手动设置<DataTemplate DataType="{x:Type ViewModels:IndustryViewModel}"> <Views:Industry /> </DataTemplate> ... <DataTemplate DataType="{x:Type ViewModels:ItemCalcsViewModel}"> <Views:ItemCalcs /> </DataTemplate> 属性。只需为您拥有的每个视图/视图模型对添加一个新的DataContext,然后就可以显示您的视图/ DataTemplate,如下所示:

UserControl

答案 1 :(得分:0)

有很多方法可以做到这一点,这取决于您的应用程序架构,复杂性等。有些涉及使用所谓的IoC containers

最简单的三个是:

  1. 直接在XAML中声明VM:

    <TabItem Header="Industry">
        <uc:Industry>
            <uc:Industry.DataContext>
                <vm:IndustryViewModel />
            </uc:Industry.DataContext>
        </uc:Industry>
    </TabItem>
    

  2. 将虚拟机声明为&#39;主要&#39; ViewModel属性:

    public IndustryViewModel IndustryViewModel
    {
        get;
        set;
    }
    

  3. 如果TabControl ViewModels从一个基类继承,您可以继续Dictionary 在&#39; main&#39;包含3 TabControl ViewModels:

    的VM
    Dictionary<string, ViewModelBase> ViewModels
    {
        get;
        set;
    }
    
    ViewModels = new Dictionary<string, ViewModelBase>();
    ViewModels.Add("Industry", new IndustryViewModel());
    // and so on...
    

    并在XAML中分配:

    <TabItem Header="Industry">
        <uc:Industry DataContext="{Binding ViewModels[Industry]}"/>
    </TabItem>