gpt4 book ai didi

wpf - DataContext 有何用途?

转载 作者:行者123 更新时间:2023-12-01 20:10:38 25 4
gpt4 key购买 nike

作为问题的延续Linking DataContext with another property in WPF .

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

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

Content 属性所绑定(bind)的 DataContext 属于 Label 控件本身!它仍然有效的事实是由于 DataContext 值从最近的父级默认继承。

但是,如果您将此标签封装在自定义控件中,并且您不想将数据绑定(bind)到该控件的 DataContext 属性,那么您可能更愿意:

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

你就在这里。现在您需要将 Settings 设置为 SearchSettings 控件的 DataContext,以便内部的 Label 进行绑定(bind),但是您不能,因为这将触发 Settings 属性的重新绑定(bind)。

我看不出使用不同来源混合绑定(bind)属性的意义:DataContextElementName 等。那么我为什么要使用DataContext

最佳答案

当你写的时候

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

您正在绑定(bind)到 myLabel.DataContext.Name,而不是 myLabel.Name

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

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

现在假设设置myWindow.DataContext = new ClassA();。现在窗口显示的数据是ClassA。如果 ClassA 有一个名为 Name 的属性,我可以编写一个标签并将其绑定(bind)到 Name (例如您的示例),并且无论值是什么存储在 ClassA.Name 中的内容将被显示。

现在,假设 ClassA 有一个 ClassB 属性,并且两个类都有一个名为 Name 的属性。下面是一个 XAML block ,它说明了 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 用户那里看到这个问题,因此我将此答案扩展到我的博客上的帖子中:What is this “DataContext” you speak of?

关于wpf - DataContext 有何用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7262137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com