C# 在“中设置数据上下文”;MainView“;“过滤到所有”;儿童视图&x27;s";
我想知道这是否是.NET的标准功能:在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
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;
}