WPF入门(四):简单绑定 - 静态资源绑定
先看代码
2 {
3 class Person
4 {
5 public string Name { get; set; }
6 public int Age { get; set; }
7 }
8 }
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:local ="clr-namespace:WpfApplication3"
5 Title="Window1" Height="298" Width="681">
6 <Window.Resources>
7 <local:Person x:Key="Tom" Name="tom1" Age="13"/>
8 </Window.Resources>
9 <Grid DataContext="{StaticResource Tom}">
10 <TextBlock Margin="25,29,0,0" Name="textBlock1" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Width="38">
11 Name:
12 </TextBlock>
13 <TextBox Text="{Binding Path=Name}" Height="21" HorizontalAlignment="Left" Margin="83,29,0,0" Name="textBlock2" VerticalAlignment="Top" Width="120" />
14 <TextBlock Text="Age:" Height="21" HorizontalAlignment="Left" Margin="25,68,0,0" Name="textBlock3" VerticalAlignment="Top" Width="38" />
15 <TextBox Text="{Binding Path=Age}" Height="23" HorizontalAlignment="Left" Margin="83,66,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
16 </Grid>
17 </Window>
这里先写了个实体类,然后在页面里绑定了实体的数据。我们看看上面的第4行 “xmlns:local ="clr-namespace:WpfApplication3"” 声明式的引入命名空间,并且声明了前缀"local".则下文使用的local元素标记都默认在本命名空间下。相当于一句"using namespace WpfApplication"。而"clr-namespace"则表明是个CLR的对象类型,应该是会反射技术。
在第6行写了个 “<Window.Resources>” 该标签是声明了资源区域。
第7行描述了一个对象"<local:Person x:Key="Tom" Name="tom1" Age="13"/> ,了解xml的都能看懂这句,声明一个Person对象,name= tome1, age = 13,编译器读到该句的时,会根据所在的命名空间创建对象。
在Grid里声明了要绑定的对象 “ <Grid DataContext="{StaticResource Tom}">” ,对Grid的 DataContext属性 绑定一个对象,该对象在静态资源"StaticResource "中的key="Tom" 的对象。这个key对应刚刚在第7行声明的对象的key.将 “<Window.Resources>” 标签内的对象存放在一个字典表(Dictionary集合)中,通过字典表的key进行检索。
对容器控件(父控件)绑定了一个对象,继续就是为其下的子控件制定要绑定的属性了。第13行
“<TextBox Text="{Binding Path=Name}" Height="21" HorizontalAlignment="Left" Margin="83,29,0,0" Name="textBlock2" VerticalAlignment="Top" Width="120" />
”
这句话就是在其中的一个TextBox控件里的Text属性里绑定 到 属性“Name”的值了。
本文中我们看到引入命名空间的写法,和前缀。和DataContext的绑定,绑定步骤:
1.对容器控件(父控件)的属性DataContext指定要绑定的对象。
1.对容器控件下的子控件(目标控件)制定要绑定的 属性名。
而在实际开发中,我们的对象不会存在静态资源这样形式的。往往在数据库中。那么如何绑定在从数据库读取到的对象呢?
先看修改后的代码:
页面
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:local ="clr-namespace:WpfApplication3"
5 Title="Window1" Height="298" Width="681" Loaded="Window_Loaded">
6
7 <Grid Name="grid1">
8 <TextBlock Margin="25,29,0,0" Name="textBlock1" Height="21" VerticalAlignment="Top" HorizontalAlignment="Left" Width="38">
9 Name:
10 </TextBlock>
11 <TextBox Text="{Binding Path=Name}" Height="21" HorizontalAlignment="Left" Margin="83,29,0,0" Name="textBlock2" VerticalAlignment="Top" Width="120" />
12 <TextBlock Text="Age:" Height="21" HorizontalAlignment="Left" Margin="25,68,0,0" Name="textBlock3" VerticalAlignment="Top" Width="38" />
13 <TextBox Text="{Binding Path=Age}" Height="23" HorizontalAlignment="Left" Margin="83,66,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
14 </Grid>
15 </Window>
后置代码:
2 {
3 public Window1()
4 {
5 InitializeComponent();
6 }
7
8 private void Window_Loaded(object sender, RoutedEventArgs e)
9 {
10 grid1.DataContext = GetPersonFromDatabase();
11 }
12
13 private Person GetPersonFromDatabase()
14 {
15 //从数据库获得数据对象 <演示>
16 return new Person() { Name = "join", Age = 30 };
17 }
首先为Grid指定了一个名字"grid1",这样我们才能在后置代码里使用这个对象。在后置代码里我们有个 "GetPersonFromDatabase"方法,我们可以在这里完成 具体的数据访问操作,我这里只是简单演示,就直接new出来了。我们在窗体的Loaded事件里有这么一句话
grid1.DataContext = GetPersonFromDatabase();
仍然是为gird对象的DataContext赋值,这个页面里做的绑定效果是一样的。F5运行可以看一下。
整个编码模式是不是觉得很熟悉,根本就是和asp.net一样的嘛。把winform开发方式和asp.net 开发方式等同起来。这样带来的问题是,我们需要学习新的xaml语言来写界面,视图。类似使用html来做网页一样。同时,运行时容器问题,就像iis,我们写好的html脚本直接放到配置好的虚拟目录下就能运行。不知道wpf准备提供这样的容器么,加入使用xaml的代码仍然要编译一次,岂不是仍然那很麻烦。如果有了这么一个新的强大的容器呢,比如说“新的浏览器”,那么未来的开发方式将是多么的令人期待,或许就不再有windows和web开发之分了。OMG...最近新流行的html5不知道是什么样子了,雷声很大,我也没接触过呢。由此看来wpf ,具体可以说是xaml将是微软的重点方向了,于是也可以说,我们在使用过渡期的语言和方式了。不过我们仍然要学习它。学的是思想。
待续ing....