作为将DataContext与WPF中的另一个属性链接的问题的延续.
在研究的最后,我非常惊讶地发现当一个人写这样的东西时:
<Label Content="{Binding Path=Name}" />
Run Code Online (Sandbox Code Playgroud)
在DataContext其对Content性能的绑定是的Label控制本身!它仍然有效的事实是由于最近父级的DataContext值的默认继承.
但是,如果您将此标签包装在自定义控件中,并且您不希望将数据绑定到该DataContext控件的属性,那么您可能更喜欢:
<Controls:SearchSettings Settings="{Binding Path=Settings}" />
Run Code Online (Sandbox Code Playgroud)
你在这里.现在,你需要设置Settings为DataContext为SearchSettings控制,对Label内部绑定反对,但你不能,因为这会触发重新绑定的Settings属性.
我看不到在使用不同来源的混合绑定属性点:DataContext通过ElementName等,那么,为什么我会永远使用DataContext?
Rac*_*hel 93
当你写作
<Label name="myLabel" Content="{Binding Path=Name}" />
Run Code Online (Sandbox Code Playgroud)
你有约束力myLabel.DataContext.Name,而不是myLabel.Name.
WPF中的XAML只是一个漂亮的用户界面,可以显示实际数据并与之交互,也就是所谓的DataContext.其他绑定源(RelativeSource,ElementName等)的目的是指向当前控件中不存在的另一个属性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>
Run Code Online (Sandbox Code Playgroud)
如您所见,DataContext基于UI对象后面的任何数据.
更新:我经常从新的WPF用户那里看到这个问题,我将这个答案扩展到我博客上的帖子中:你说的"DataContext"是什么?
| 归档时间: |
|
| 查看次数: |
54185 次 |
| 最近记录: |