您的位置:首页 > 其它

WPF中的binding(三)- 使用DataContext作为Binding的数据源

2016-05-22 15:38 573 查看
前面两节介绍了通过把CLR对象指定赋值给Binding . Source或者把CLR对象的名称赋值给Binding.ElementName而实现将单个CLR对象指定为Binding的Source的方法。下面我们介绍没有Source的Binding,将DataContext作为Binding的源的方法。

DataContext,顾名思义就是数据上下文,它被定义在FrameworkElement类里,这个类是WPF控件的基类,包括所有的WPF控件和容器都含有这个属性。我们又知道,WPF的UI布局是树形结构,树的每个节点都是控件,就是说每个节点元素都有DataContext。

当一个Binding只知道自己的Path而不知道自己的Source时,它会沿着UI树一级一级的向上查找,路过每个节点时都会查看这个节点的DataContext是否具有Path所指定的属性,知道找到为止。如果到了树的根部,还没找到那就是没有Source。
为了验证这一点,我们还是先定义个Student类:

public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}

然后再XAML文件中添加如下代码:

<Grid x:Name="grid">
<Grid.DataContext>
<local:Student Id="1" Name="Hyman" Age="29"/>
</Grid.DataContext>
<TextBox Height="23" HorizontalAlignment="Left" Margin="184,59,0,0" Name="textBox1" VerticalAlignment="Top" Width="120"
Text="{Binding Path=Id}"/>
<TextBox Height="23" HorizontalAlignment="Left" Margin="184,105,0,0" Name="textBox2" VerticalAlignment="Top" Width="120"
Text="{Binding Path=Name}"/>
<TextBox Height="23" HorizontalAlignment="Left" Margin="184,160,0,0" Name="textBox3" VerticalAlignment="Top" Width="120"
Text="{Binding Path=Age}"/>

<TextBlock Height="23" HorizontalAlignment="Left" Margin="114,62,0,0" Name="textBlock1" Text="ID:" VerticalAlignment="Top" />
<TextBlock Height="23" HorizontalAlignment="Left" Margin="114,160,0,0" Name="textBlock2" Text="Name:êo" VerticalAlignment="Top" />
<TextBlock Height="23" HorizontalAlignment="Left" Margin="114,105,0,0" Name="textBlock3" Text="Age:êo" VerticalAlignment="Top" />
</Grid>


我们要实现的效果是在界面的三个TextBox中分别显示一个Student对象的Id、Name和Age,首先我们在Grid. DataContext中定义了一个Student对象,然后在TextBox对象中分别绑定为其依赖属性Text绑定了Id、Name和Age,此时我们没有指定Binding的Source,这样Binding就会沿着UI树在每个节点的DataContext中查找对应的Path,在在他们上层的Grid.DataContext中找到了这三个CLR属性,然后完成了显示。



另外为了实现这一效果,我们也可以在cs代码中定义一个Student对象,然后将其赋值给grid的DataContext。

Student student = new Student()
{
Id = 1,
Name = "Hyman",
Age = 29
};
this.grid.DataContext = student;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: