WPF快速入手(一).4

来源:互联网 发布:下载java软件 编辑:程序博客网 时间:2024/06/11 06:36
补充知识:WPF中所有单一内容控件的统称,对应的父类为System.Windows.Controls.ContentControl;与ContentControl平行的还有一类控件叫做 ItemsControlWPF中所有控件集合对象的统称,例如:ListView, ListBox, TreeView等,这一点一定要区分清楚,可以认为这一类控件是为了展现有效的展现及组织一组控件而设计的,对应的父类为System.Windows.Controls.ItemsControl,这些控件和Panel容器类控件是不同的概念,要了解他们之间的关系可以参看下面这张类继承关系图:

 

 

 

 后台逻辑

  在后台用ADO.NET写一个获取DataTable的方法及一个共有属性拥有获取DataTable.DefaultView,同时,实现Refresh按钮的方法。此部分不是练习重点这里不做介绍了,代码如下:

 

        public Window2()

        {

            InitializeComponent();

            getData();

        }

 

        SqlDataAdapter sda;

        DataTable dt;

 

        void getData()

        {

            //init sqlconnection

            SqlConnectionStringBuilder connbuilder = new SqlConnectionStringBuilder();

            connbuilder.DataSource = "(local)";

            connbuilder.IntegratedSecurity = true;

            connbuilder.InitialCatalog = "AdventureWorks";

 

            //start to make sql query

            SqlConnection conn = new SqlConnection(connbuilder.ConnectionString);

            sda = new SqlDataAdapter("select ContactID,FirstName,LastName,EmailAddress from person.contact where ContactID<=100;", conn);

            SqlCommandBuilder commbuilder = new SqlCommandBuilder(sda);

            sda.UpdateCommand = commbuilder.GetUpdateCommand();

            dt = new DataTable();

            sda.AcceptChangesDuringUpdate = true;

            sda.Fill(dt);

        }

 

        private void button1_Click(object sender, RoutedEventArgs e)

        {

            getData();

        }

 

前台界面与后台数据的Binding

  Binding这个此翻译起来有争议,为了避免误导大家,因此我还是不写成中文了。

  好了!接下来终于到最精彩的地方了。各位读者们一会会为后面所发生的事情而感到震惊的,一切就是这样的完成了……

 

1)      ListView控件指明数据源,通过ItemSource属性设置,这一部分需要通过代码来实现(目前位置还不知道如何通过XAML语言来实现,哪位大哥可以指点一下),在void getData()方法的结尾处增加一行代码“listView1.ItemsSource = dt.DefaultView;

2)      GridViewColumn指明当前列对应于数据源的哪一项,可以通过DisplayMemberBinding属性来实现,其中的值便是上一步中指明的数据源dt.DefaultView的每一个数据项的名称

 

                    <GridViewColumn Header="ContactID" DisplayMemberBinding="{Binding Path=ContactID}"></GridViewColumn>

                    <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding Path=FirstName}"></GridViewColumn>

                    <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding Path=LastName}"></GridViewColumn>

                    <GridViewColumn Header="EmailAddress" DisplayMemberBinding="{Binding Path=EmailAddress}"></GridViewColumn>

 

  此时试着F5 Debug运行以下,应该已经可以看到这样的画面了

 

 

 

  但是,当我们点击ListView中的记录时,里面的书籍并没有映射到下面的文本框中。接下来我们就来实现这部分功能。

 

1)      为了简化代码,在WrapPanel元素中指明一个公共的上下文,可以通过增加属性DataContext="{Binding ElementName=listView1,Path=SelectedItem}

2)      分别为四个输入框指明相应的数据源,可以通过TextBox元素中的Text属性实现,实现后代码如下:

 

<TextBox Name="textBox_ContactID" MinWidth="100" Text="{Binding ContactID}" />

……

<TextBox Name="textBox_FirstName" MinWidth="100" Text="{Binding FirstName,UpdateSourceTrigger=PropertyChanged }" />

……

<TextBox Name="textBox_LastName" MinWidth="100" Text="{Binding LastName}" />

……

<TextBox Name="textBox_EmailAddress" MinWidth="100" Text="{Binding EmailAddress}" />

 

  上面这一段代码相信有很多刚刚接触WPF的人一定会感到陌生,这里解释一下:

 

  上面这段XAML语句里面,大家看着最不顺眼的应该就是{Binding }这种语句了吧,这个就是WPF重要特性之一“Binding”,他是用来实现界面元素的属性与后台数据之间的Binding,通过这种形式将前台界面与后台数据联系在一起达到界面与数据耦合的目的。与直接覆值相比较,存在这如下几点特性上的差异:

 

1)      Binding可以通过XAML语句实现界面与数据(可以是界面元素或后台对象)的耦合(也可以通过代码来实现),这一实现主要是依靠WPF的另一个特性Dependency Property来实现的。示意图如下:

 

 

 

2)      Binding可以实现制定方向的绑定,方向有三种,OneWay, TwoWay, OneWaytoSource,其形象的表示如下图所示:

 

 

3)      可配置触发器,这一特性用来解释,界面与数据的Binding是什么时候发生的,可以通过UpdateSourceTrigger属性实现,存在如下几种值

 

LostFocus :当控件失去焦点时触发,前面例子里TextBox.Text默认就是这种形式的

PropertyChanged:当属性改变时触发

Explicit:这个就可以看作是需要显示调用了,需要主动取调用相应的UpdateSource方法才可以触发

 

  用法可以像这样“{Binding FirstName,UpdateSourceTrigger=PropertyChanged }

 

4)      不抛出异常,这一点对于开发及测试人员来说可能并不怎么好,当一个数据Binding失败是,程序运行是不受影响的,只是相应的属性值为空了,对于开发人员来讲只能通过VS Debug时的输出窗口看到Binding失败的调试信息。而对于测试人员来说那就只能是靠肉眼了。

 

  具体内容可以参考MSDN中的” Data Binding Overview”这篇文章,这里只是为大家实现一个引路的工作

 

  现在再试试应该已经可以实现ListViewTextBox的联动了,不过此时,对数据的改动还无法更新到数据库中。需要继续修改。

 

1)      button1_Click事件中增加一条语句用于接受书籍更新sda.Update(dt);

2)      XAML设计区,最顶层Window元素中增加属性,Closed="Window_Closed",然后在后台实现相应的方法代码如下

 

  两个方法具体代码如下,由于与WPF关系不大,因此不做讲解了:

 

        private void button1_Click(object sender, RoutedEventArgs e)

        {

            sda.Update(dt);

            getData();

        }

        private void Window_Closed(object sender, EventArgs e)

        {

            sda.Update(dt);

        }

 

  这样就完整的实现了这个练习。

 

  原文:http://blog.csdn.net/mmmaaaggg/archive/2008/06/09/2526596.aspx

原创粉丝点击