WPF Data Binding之地位与基础【一】

【1】Data Binding在WPF中的地位

从传统的Winform转移到WPF上,对于一个三层程序而言,数据存储层由数据库和文件系统组成,数据传输和处理仍然使用.NetFramework的ADO.NET等基本类(与Winform开发一样)。展示层则使用WPF类库来实现,而展示层和逻辑层的沟通就使用Data Binding来实现。可见,Data Binding在WPF中所起的作用就是高速公路的作用。有了这条高速公路,加工好的数据自动送达用户界面并加以显示,被用户修改过的数据也会自动传回业务逻辑层,一旦数据被加工好又会被送往界面。。。。

程序的逻辑层就像是一个强有力的引擎一直在运作,用加工好的数据驱动用户界面以文字、图形、动画等形式把数据显示出来------这就是数据驱动UI。

引入Data Binding之后,数据在逻辑层和用户界面直来之去、不涉及逻辑问题,这样的用户界面部分基本上不包含算法:Data Binding本身就是双向通信,对于多个UI元素关注同一个数据的情况,只需要用Data Binding将这些UI元素和数据一一关联上(以数据为中心的星形结构),当数据变化后,这些UI元素会同步显示这一变化。前面提到的问题也都迎刃而解了。更重要的是经过这样的优化,所有与业务逻辑相关的算法都处在业务逻辑层,逻辑层成了一个可以独立运转,完整的体系,而用户界面则不需要任何逻辑代码。完全依赖和从属于业务逻辑层。这样做有两个显而易见的好处,第一:如果把UI看做是应用程序的皮,把存储层和逻辑层看作是程序的瓤,我们可以很轻易的把皮撕下来换一个新的。第二:因为数据层能够独立运作,自成体系,所以我们可以进行更完善的单元测试而无需借助UI自动化测试工具----你完全可以把单元测试看作是一个“看不见的UI”,单元测试只是使用这个UI绕过真实的UI直接测试业务逻辑罢了。

【2】Binding 基础

如果把Binding比作数据的桥梁,那么它的两端分别是源(Source)和目标(Target)。数据丛哪里来哪里就是源,到哪里去哪里就是目标。一般情况下,Binding的源是业务逻辑层的对象,Binding的目标是UI层的控件对象。这样数据就会源源不断的通过Binding送达UI界面,被UI层展现,这就完成了数据驱动UI的过程。有了这座桥梁,我们不仅可以控制车辆在源与目标之间是双向通行还是单向通行。还可以控制数据的放行时机,甚至可以在桥上搭建一些关卡用来转换数据类型或者检验数据的正确性。

数据源是一个对象,一个对象本身可能会有很多数据,这些数据又通过属性暴露给外界。那么其中哪个元素是你想通过Binding送达UI元素的呢,换句话说,UI元素关心的是哪个属性值的变化呢?这个属性值称之为Binding的路径(Path)。但光有属性还不行-------Binding是一种自动机制,当值变化后属性要有能力通知Binding,让Binding把变化传递给UI元素。怎样才能让一个属性具备这种通知Binding值已经改变的能力呢?方法是在属性的Set语句中激发一个PropertyChanged事件。这个事件不需要我们自己声明,我们要做的事是让作为数据源的类实现System.ComponentModel名称空间中的INotifyPropertyChanged接口。当为Binding设置了数据源之后,Binding就会自动侦听来自这个接口PropertyChanged事件。

通过对Binding有了一个基本概念之后,让我们看一个最基本的例子。这个例子是创建一个简单的数据源并通过Binding把它连接到UI元素上。首先,我们创建一个名为"Student"的类,这个类的实例将作为数据源来使用。

C#:

class Student:INotifyPropertyChanged
{
    private string _name;
    public event PropertyChangedEventHandler PropertyChanged;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;

            // 通知UI,绑定的值发生了改变
            if (PropertyChanged != null)
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
        }
    }

    public int Id { set; get; }
}

XAML:

<Window x:Class="WpfApplication6.wnd62"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="wnd62" Height="110" Width="525">
    <StackPanel Background="LightSlateGray" Margin="5">
        <TextBox x:Name="_txtBox" Margin="5" />
        <Button Margin="5" Height="23" Click="Button_Click"/>
    </StackPanel>
</Window>

Binding代码:

public partial class wnd62 : Window
{
    Student _stu = new Student();

    public wnd62()
    {
        InitializeComponent();

        // 绑定数据
        Binding binding = new Binding();
        binding.Source = _stu;
        binding.Path = new PropertyPath("Name");
        BindingOperations.SetBinding(_txtBox, TextBox.TextProperty, binding);

        //or
        //_txtBox.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = stu });
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        _stu.Name = "wnd62";
    }
}

在准备Binding的部分,先使用“Binding binding = new Binding();”声明Binding类型变量并创建实例,然后使用“binding.Source=_stu;”为Binding实例指定数据源,最后使用“bind.Path= new PropertyPath(‘Name‘)”语句为Binding指定访问路径。

把数据源和目标连接在一起的任务是使用“BindingOperations.SetBinding(...)”方法完成的,这个方法的3个参数是我们记忆的重点:

第一个参数是指定Binding的目标

第二个参数指明目标的哪个数据。

第三个参数指定使用哪个Binding实例将数据源和目标关联起来。

更新的模型:

时间: 2024-09-30 05:26:43

WPF Data Binding之地位与基础【一】的相关文章

WPF Data Binding之数据的转换和校验【四】

Binding的作用就是架在Source和Target之间的桥梁,数据可以在这座桥梁的帮助下来流通.就像现实社会中桥梁需要设置安检和关卡一样,Binding这座桥上也可以设置关卡对数据进行验证,不仅如此,如果Binding两端需要不同的数据类型的时候我们还可以为数据设置转换器. Binding用于数据有效性校验的关卡是他的ValidationRules属性,用于数据类型转换的关卡是它的Convert属性. 1.1 Binding的数据校验 Binding的ValidationRules属性是Co

WPF data binding

Binding这个类包含以下几个常用的属性: ElementName: Gets or sets the name of the elements to use as the binding source object. [Default is null] Source: Gets or sets the object to use as the binding source. RelativeSource: Gets or sets the binding source by specifyi

WPF Data Binding之控件作为源(Source)与路径(Path)【一】

Binding 的源也就是数据的源头.Binding对源的要求并不苛刻------只要它是一个对象,并且通过属性(Property)公开自己的数据,它就能作为Binding 的源. 前面一个例子已经向大家证明,如果想让作为Binding源的对象具有自动通知Binding自己属性值已经已经变化的能力,那么就需要让类实现INotifyChanged接口并在属性的Set语句中激发PropertyChanged事件.在日常生活中,除了使用这种对象作为数据源之外,我们还有更多的选择,比如用一个控件做为另一

WPF QuickStart系列之数据绑定(Data Binding)

这篇博客将展示WPF DataBinding的内容. 首先看一下WPF Data Binding的概览, Binding Source可以是任意的CLR对象,或者XML文件等,Binding Target需要有依赖属性.这样便可以进行Data Binding.请看下面的示例, C# public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new Pe

[WPF]如何调试Data Binding

前言 在WPF开发中,将ViewModel中对象绑定到UI上时,会出现明明已经将数据对象Binding到UI,但是UI上就是不显示等等的问题.这篇博客将介绍WPF Data Binding调试相关的内容. 场景一(Binding的属性不存在) ViewModel: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.DataContext = new ViewMo

Data Binding和INotifyPropertyChanged是如何协调工作的?

前言 WPF的一大基础就是Data Binding.在基于MVVM架构的基础上,只有通过实现INotifyPropertyChanged接口的ViewModel才能够用于Data Binding. 要实现INotifyPropertyChanged接口,只需要实现一个事件,event PropertyChangedEventHandler PropertyChange. delegate & event基础知识回顾 先来回顾下C#里delegate和event的基础知识. 我们知道在C#里,ev

WPF binding&lt;一&gt; Data Binding在WPF中的地位

在代码中经常看到      <Image Source="{Binding ElementName=LBoxImages, Path=SelectedItem.Source}" /> 或者是 <WrapPanel Orientation="Horizontal" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Li

WPF中的数据绑定Data Binding使用小结

完整的数据绑定的语法说明可以在这里查看: http://www.nbdtech.com/Free/WpfBinding.pdf MSDN资料: Data Binding: Part 1 http://msdn.microsoft.com/en-us/library/aa480224.aspx Data Binding: Part 2 http://msdn.microsoft.com/en-us/library/aa480226.aspx Data Binding Overview http:/

【转载一篇WPF之Binding】WPF之Binding深入探讨

1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的程序来说,算法一般分布在这几处: A.数据库内部. B.读取和写回数据. C.业务逻辑. D.数据展示. E.界面与逻辑的交互. A,B两部分的算法一般都非常稳定,不会轻易去改动,复用性也很高:C处与客户需求最紧密,最复杂,变化最大,大多少算法都集中在这里.D,E负责UI和逻辑的交互,也占有一定量的