C# 在“中设置数据上下文”;MainView“;“过滤到所有”;儿童视图&x27;s";

C# 在“中设置数据上下文”;MainView“;“过滤到所有”;儿童视图&x27;s";,c#,.net,wpf,mvvm,user-controls,C#,.net,Wpf,Mvvm,User Controls,我想知道这是否是.NET的标准功能:在ParentView中设置DataContext时,它会过滤到所有子视图 假设您有ParentView、ChildView1和ChildView2: <UserControl x:Class="DXWPFApplication1.ParentView" xmlns:view="clr-namespace:DXWPFApplication1" xmlns="http://schemas.microsof

我想知道这是否是.NET的标准功能:在
ParentView
中设置
DataContext
时,它会过滤到所有
子视图

假设您有ParentView、ChildView1和ChildView2:

<UserControl x:Class="DXWPFApplication1.ParentView"
             xmlns:view="clr-namespace:DXWPFApplication1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             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">
    <Grid>
        <view:ChildView1  x:Name="childView1"/>
    </Grid>
</UserControl>

<UserControl x:Class="DXWPFApplication1.ChildView1"
             xmlns:view="clr-namespace:DXWPFApplication1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             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">
    <Grid>
        <view:ChildView2  x:Name="childView2"/>
    </Grid>
</UserControl>
注意:设置第一个
DataContext

为什么我只设置了父视图的
DataContext
,却设置了所有的DataContext


我能做些什么来防止这种情况发生?

这是标准行为,通常是需要的。要防止这种情况,请在标记中将DataContext设置为{x:Null}

可视化树中的组件从其父级插入数据上下文。您的子视图位于父视图的可视树中,因此它将获得指定的父上下文。如果要更改它,需要显式地将其设置为不同的值(在子视图构造函数中或在xaml中,例如


为什么这样做:因为它几乎总是你想要的。

威廉如果你对每个视图使用单独的视图模型,你应该做的是嵌套视图模型

因此,假设您有
MainViewModel
,其属性公开了
ChildViewModel1
ChildViewModel2
。然后将子usercontrols的绑定设置为

DataContext=“{Binding ChildViewModel1}”

DataContext=“{Binding ChildViewModel2}”
分别


主视图始终将其数据上下文维护为
MainViewModel

我对每个
视图使用单独的
ViewModels
。所以我不想设置所有的
DataContext。
public ParentView() 
        {
            InitializeComponent();

            DataContext = "ViewModel"; //BreakPoint here

            //
            //When the first DataContext is set, all the DataContext's below are set as well
            //

            childView1.DataContext = DataContext;
            childView1.childView2.DataContext = DataContext;
        }