什么是DataContext的?

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

在研究的最后,我很惊讶地发现,当人们写这样的话:

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

Content属性绑定的DataContextLabel控件本身! 它仍然有效的事实是由于来自最近的父级的DataContext值的默认inheritance。

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

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

在这里,你是。 现在,您需要将SearchSettings控件的“设置SettingsDataContext ,对于“内部Label进行绑定,但不能,因为这将触发Settings属性的重新绑定。

我无法看到使用不同来源混合绑定属性的要点: DataContextElementName等。为什么我会使用DataContext

当你写

 <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用户那里看到这个问题,我把这个答案扩展到了我的博客上的一个post: 你说的是什么“DataContext”?

在这种情况下,你可以这样做:

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

假设您希望SearchSettings的所有内容都可以使用Settings作为数据上下文。 基本上,DataContext影响元素本身的任何后代,不显式覆盖它。

来自CodeGject的kishore Gaddam:

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

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

在大多数情况下,您希望绑定到DataContext,在ItemsControls上的一些模板中,它是绑定到当前模板化项目的唯一方式。 进一步绑定到DataContext是很好的写和读,因为它们是简洁的。

在你的例子中,你仍然可以设置DataContext,你只需要分别修改设置的绑定:

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