WPF入门(四):简单绑定 - 静态资源绑定

先看代码

 

1 namespace WpfApplication3
2 {
3     class Person
4     {
5         public string Name { getset; }
6         public int  Age { getset; }
7     }
8 }

 

 

代码
 1 <Window x:Class="WpfApplication3.Window1"
 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.对容器控件下的子控件(目标控件)制定要绑定的 属性名。

 

而在实际开发中,我们的对象不会存在静态资源这样形式的。往往在数据库中。那么如何绑定在从数据库读取到的对象呢?

先看修改后的代码:

页面

代码
 1 <Window x:Class="WpfApplication3.Window1"
 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>

 

 

后置代码:

 

代码
 1   public partial class Window1 : 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....

posted on 2011-01-14 09:43  张云飞VIR  阅读(4179)  评论(2编辑  收藏  举报