为了账号安全,请及时绑定邮箱和手机立即绑定

请问什么是DataContext?

/ 猿问

请问什么是DataContext?

PIPIONE 2019-09-06 07:06:20

什么是DataContext?

作为将DataContext与WPF中的另一个属性链接的问题的延续。

在研究的最后,我非常惊讶地发现当一个人写这样的东西时:

<Label Content="{Binding Path=Name}" />

DataContext其对Content性能的绑定是的Label控制本身!它仍然有效的事实是由于最近父级的DataContext值的默认继承。

但是,如果您将此标签包装在自定义控件中,并且您不希望将数据绑定到该DataContext控件的属性,那么您可能更喜欢:

<Controls:SearchSettings Settings="{Binding Path=Settings}" />

你在这里。现在,你需要设置SettingsDataContextSearchSettings控制,对Label内部绑定反对,但你不能,因为这会触发重新绑定的Settings属性。

我看不到在使用不同来源的混合绑定属性点:DataContext通过ElementName等,那么,为什么我会永远使用DataContext


查看完整描述

3 回答

?
大话西游666

当你写作

<Label name="myLabel" Content="{Binding Path=Name}" />

你有约束力myLabel.DataContext.Name,而不是myLabel.Name

WPF中的XAML只是一个漂亮的用户界面,可以显示实际数据并与之交互,也就是所谓的DataContext。其他绑定源(RelativeSourceElementName等)的目的是指向当前控件中不存在的另一个属性DataContext


所以假设你有一个窗口。如果不设置DataContext,窗口仍会显示,但后面没有数据。


现在假设设置myWindow.DataContext = new ClassA();。现在窗口显示的数据是ClassA。如果ClassA有一个被调用的属性Name,我可以编写一个标签并将其绑定到Name(例如你的例子),并且ClassA.Name将显示存储的任何值。

现在,假设ClassA有一个属性,ClassB并且两个类都有一个名为的属性Name。这是一个XAML块,它说明了DataContext的用途,以及一个控件如何引用不属于它自己的DataContext的属性的示例

<Window x:Name="myWindow"> <!-- DataContext is set to ClassA -->
    <StackPanel> <!-- DataContext is set to ClassA -->

        <!-- DataContext is set to ClassA, so will display ClassA.Name -->
        <Label Content="{Binding Name}" />

         <!-- DataContext is still ClassA, however we are setting it to ClassA.ClassB -->
        <StackPanel DataContext="{Binding ClassB}">

            <!-- DataContext is set to ClassB, so will display ClassB.Name -->
            <Label Content="{Binding Name}" />

            <!-- DataContext is still ClassB, but we are binding to the Window's DataContext.Name which is ClassA.Name -->
            <Label Content="{Binding ElementName=myWindow, Path=DataContext.Name}" /> 
        </StackPanel>
    </StackPanel></Window>

如您所见,DataContext基于UI对象后面的任何数据。

更新:我经常从新的WPF用户那里看到这个问题,我将这个答案扩展到我的博客上的帖子:你说的“DataContext”是什么?



查看完整回答
反对 回复 2019-09-10
?
互换的青春

来自CodeProject的kishore Gaddam:

DataContext是数据绑定中最基本的概念之一。Binding对象需要从某个地方获取数据,并且有几种方法可以指定数据源,例如直接在Binding中使用Source属性DataContext,在树中遍历时从最近的元素继承a ,设置ElementNameRelativeSource属性在Binding对象中。

有关CodeProject的详细示例:http://www.codeproject.com/Articles/321899/DataContext-in-WPF



查看完整回答
反对 回复 2019-09-10
?
隔江千里

在那种特殊情况下,您可以这样做:

<Controls:SearchSettings DataContext="{Binding Path=Settings}" Settings="{Binding}" />

假设您希望SearchSettings可能包含的所有内容都使用“设置”作为其数据上下文。基本上,DataContext会影响元素本身以及任何未明确覆盖它的后代。


查看完整回答
反对 回复 2019-09-10

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信