什么是DataContext的?
作为将DataContext与WPF中的另一个属性关联的问题的延续。
在研究的最后,我很惊讶地发现,当人们写这样的话:
<Label Content="{Binding Path=Name}" />
Content
属性绑定的DataContext
是Label
控件本身! 它仍然有效的事实是由于来自最近的父级的DataContext值的默认inheritance。
但是,如果将此标签包装在自定义控件中,并且不希望将数据绑定到该控件的DataContext
属性,则更可能喜欢:
<Controls:SearchSettings Settings="{Binding Path=Settings}" />
在这里,你是。 现在,您需要将SearchSettings
控件的“设置Settings
为DataContext
,对于“内部Label
进行绑定,但不能,因为这将触发Settings
属性的重新绑定。
我无法看到使用不同来源混合绑定属性的要点: DataContext
, ElementName
等。为什么我会使用DataContext
?
当你写
<Label name="myLabel" Content="{Binding Path=Name}" />
您绑定到myLabel.DataContext.Name
,而不是myLabel.Name
。
WPF中的XAML只是一个漂亮的用户界面,用于显示实际数据并与其交互,否则称为DataContext
。 其他绑定源( RelativeSource
, ElementName
等)的目的是指向另一个不存在于当前控件的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}"/>