3

我想知道这是否是 .NET 的标准功能:在 中设置 时DataContextParentView它会过滤到所有child views.

假设你有 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>

ParentView背后的代码:

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;
        }

注意:第一次设置时的断点DataContext

为什么我只设置了 ParentView 时所有的 DataContexts 都设置了DataContext

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

4

3 回答 3

2

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

于 2012-05-23T08:12:41.110 回答
1

可视化树中的组件从其父级继承数据上下文。您的子视图位于父视图的可视化树中,因此它将获得分配的父上下文。如果要更改它(例如在子视图构造函数中或在 xaml 中<view:ChildView2 DataContext="{x:Null}" x:Name="childView2"/>),则需要将其显式设置为不同的值。

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

于 2012-05-23T08:13:09.547 回答
1

Willem 如果您为每个视图使用单独的 ViewModel,您应该做的是嵌套您的 ViewModel。

所以说你有MainViewModel暴露的属性ChildViewModel1ChildViewModel2. 然后您将子用户控件的绑定设置为

DataContext="{Binding ChildViewModel1}"

DataContext="{Binding ChildViewModel2}"分别

主视图始终将其 DataContext 维护为MainViewModel

于 2012-05-23T08:19:06.557 回答