WPF快速入手(一).4

补充知识: WPF 中所有单一内容控件的统称,对应的父类为 System.Windows.Controls.ContentControl ;与 ContentControl 平行的还有一类控件叫做 ItemsControl WPF 中所有控件集合对象的统称,例如: 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.youkuaiyun.com/mmmaaaggg/archive/2008/06/09/2526596.aspx

### 如何快速搭建 WPF 应用程序 要快速创建WPF (Windows Presentation Foundation) 应用程序,可以通过 Visual Studio 提供的项目模板来实现。以下是关于如何构建基础 WPF 应用的核心要点: #### 使用 Visual Studio 创建 WPF 项目 Visual Studio 是开发 WPF 应用的主要工具之。启动 Visual Studio 后,在新建项目的选项中选择 **WPF App (.NET Framework)** 或者 **WPF Application (.NET Core/.NET 5+)** 模板[^1]。 完成项目创建后,默认情况下会生成个名为 `MainWindow.xaml` 的文件以及其对应的代码隐藏文件 `MainWindow.xaml.cs`。这标志着基本的应用框架已准备好,开发者可以直接在此基础上扩展功能[^2]。 #### 配置初始界面布局 XAML 文件用于定义用户界面的设计部分。对于初学者来说,可以从简单的控件入手,比如按钮(Button),标签(Label)或者文本框(TextBox)。下面是个非常基础的例子展示如何向窗口添加个按钮: ```xml <Window x:Class="MyFirstWPFApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="我的第WPF应用" Height="350" Width="525"> <Grid> <Button Content="点击我!" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </Window> ``` 这段 XAML 定义了个带有单个居中的按钮的窗口。 #### 实现 MVVM 架构模式 为了使应用程序更加模块化和易于维护,推荐采用 MVVM(Model-View-ViewModel)设计模式。这种架构将 UI 层(View)与业务逻辑层(ViewModel)分离出来,从而提高了测试性和灵活性。 具体实施时可按照如下方式操作: 1. 将 ViewModel 类放置于单独命名空间下; 2. 在 View 中通过 DataContext 绑定到相应的 ViewModel 对象上; 3. 利用命令(Commanding)机制处理交互事件而不是直接写入 Click 处理器函数体内。 例如设置 Button 的 Command 属性绑定至某个 ICommand 接口实例即可触发特定行为而无需显式编写 C# 方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值