WPF中数据绑定


数据绑定基本概述

什么是数据绑定

定义:在应用程序UI与业务逻辑之间建立连接的过程。

具体表现:

1.       当数据绑定正确,若数据源发生变化,则绑定的目标对象也将会发生更改。

2.       当数据绑定正确,若绑定目标对象发生变化,则数据源也将自动更新数据。

3.       如果不严格说可以将任意的.net对象绑定在一起。

数据绑定相关的基本概念

首先让我们来看MSDN上的理解,如图:

从上图我们可以看到一个完整的数据绑定的示意图,里面包括三个基本对象:绑定源、绑定目标、绑定方式,这三点是我自己总结的,我觉得这样概况比较好理解。

绑定源

1.       定义:

指提供数据的源对象,如果从数据绑定的定义上对应的话,一般是对应业务逻辑中提供的某个对象。

2.       绑定源类型:虽然这个东西不需要记忆,但是必须得了解

Ø  公共语言运行时(CLR)中对象:

Ø  动态对象:

Ø  ADO.NET对象:如DataTable,DataSet等

Ø  XML对象:如XMLNode、XMLDocument、XmlElement

Ø  DependencyOject对象:即实现了DependencyOject的CLR对象或者自定义的都行

3.       具体绑定实例:

Ø  使用整个对象作为绑定源

即将整个对象作为绑定源,然后通过Source或者DataContext属性来指定绑定源,然后提供一个空白绑定声明:{Binding}

Ø  使用集合对象作为绑定源

通常都是用自定义的集合作为绑定源,如实现IEnumeratble接口的任何集合,且如果要实现动态绑定(插入或者删除自动更新),则必须实现INotifyCollectionChanged 接口,ObservableCollection<T> 类是公开 INotifyCollectionChanged 接口的数据集合的内置实现。

绑定目标

1.       定义:显示数据的对象,对应数据绑定的概念中一般是UI界面中的某个控件

2.       绑定目标对象的属性:

数据绑定一般是对绑定目标的某个属性值进行绑定,所以一定注意,绑定目标属性一定必须是依赖属性,而绑定目标却不限于自定义的CLR对象。

绑定模式

1.       定义:有了绑定源,绑定目标对象,就差两个事物之间关联,所以2个之间的绑定方式就是绑定模式,目前存在4中绑定模式。

2.       绑定模式:

l  OneWay模式:

若绑定源数据的更改,会自动更新到绑定目标;但是若绑定目标的更改,则不会更新到绑定源。一般适用于绑定目标为隐式只读控件。

l  TwoWay模式:

不管是绑定源还是绑定目标任何一方的数据更改,都会自动更新另一方。这种方式一般适用比较广泛,一般是可读写的控件。

l  OneWayToSource模式:

刚好与OneWay模式相反,即绑定源的更改,不会通知绑定目标的更改;绑定目标的更改,会通知绑定源的更改。一般适用于从UI控件输入值。

l  OneTime模式:

就一次性更改通知,即绑定源初始化一次更新到绑定目标,后续更改不会更新,这种模式一般不怎么常用,一般适用于静态数据的初始化,个人觉得这种时候用后台.CS代码实现会比较好。

数据绑定的使用细节注意

XMAL中数据绑定的声明

1.       绑定声明的格式:

{Binding 属性名称1=属性值1,属性名称2=属性值2,属性名称3=……}

外围一定要{},其次绑定类属性之间用,隔开

Eg:<TextBox   Text=”{Binding  Source={StaticResource MyData}, Path=”PersonName”}”

2.       绑定对象类的常用属性:

ElementName:获取或者设置要用作绑定源对象的元素名称

Mode:获取或者设置绑定模式

Path:获取或者设置绑定源属性的路径

RelativeSource:通过指定绑定源相对于绑定目标的位置,获取或者设置绑定源

Source:获取或者设置要用作绑定源的对象

TargetNullValue:获取或设置当绑定源的值为NULL时在绑定目标显示的值

StringFormat:获取或设置一个字符串,该字符串指定如果绑定值显示为字符串的格式

XPath:获取或设置一个XPath查询,查询返回要适用的XML绑定源值

3.       绑定对象类的附加事件:

SourceUpdated: 当值从绑定目标传输到绑定源时发生,但只针对 NotifyOnSourceUpdated 值设置为 true 的绑定

TargetUpdated: 当值从绑定源传输到绑定目标时发生,但只针对 NotifyOnTargetUpdated 值设置为 true 的绑定

Path属性指定绑定源值得路径语法

1.       Path属性值要用到绑定源对象的某个属性值,格式:Path=绑定源对象.属性名,如:Path=PropertyName

2.       Path指定绑定源对象的某个属性值的子属性,格式:Path=绑定源对象.属性名.子属性名如:Path=PropertyName.Width

3.       Path指定绑定源的附加属性,格式:Path=(附加属性源.附加属性),如:Path=(DockPanel.Dock)

4.       Path指定绑定源的索引值,格式:Path=属性名[索引号],如:Path=Shopping[0]

5.       Path指定绑定源的值是属性和索引的混合使用,格式:Path=属性名.子属性[索引号],如:Path=Shopping.Order[0]

6.       在索引器内部,您可以有多个由逗号 (,) 分隔的索引器参数。 可以使用圆括号指定每个参数的类型。 例如,您可以有 Path="[(sys:Int32)42,(sys:Int32)24]"

7.       Path指定集合视图,用斜杠指定当前项,格式:Path=/绑定项

8.       Path指定到当前源,如:Text=”{Binding}” 等价Text=”{Binding path=.}”

数据绑定多种绑定类型

数据绑定的类型可谓变化多端,虽然下面描述的信息都是从MSDN上来的,但是MSDN上基本是从分主题进行阐述,笔者看完后虽然都会做了一遍,但是对于数据绑定还是迷迷糊糊的,感觉不到本质的东西,所以笔者进行了简单总结概括,方便理解和记忆。

首先我们从绑定的基本概念着手,数据绑定基本要素分为绑定源、绑定目标和绑定模式。因为绑定目标相对来说比较形象,所以我从绑定目标角度来分析,从WPF的构成来看,一个窗口类对象分为2个部分,分别是XAML语言构成.xaml文件和C#语言构成的.CS文件,简单说这就是微软的Codebehind技术吧,具体两者之间的详细区别我这里就不多说了,如果下面讲解会涉及到的我会提下。综上所述,我们可以这样分类数据绑定,绑定目标可以是.XAML文件的内容和.CS文件的内容,绑定源也可以是.XAML文件内容和.CS文件内容,经过交叉组合得到以下大类型:(绑定目标为.CS内容刚好是相反,并且可以通过绑定模式实现所以就不分析)

绑定目标对象为.XAML内容

尽然绑定目标为.xaml文件内容,就包括:.xaml中的各种控件,各种静态资源,所以绑定目标一般是控件的属性,或者是静态资源的属性值等。在这个条件下根据绑定源的不同,又可以分为2类:

绑定源为.xaml文件内容

1.       绑定目标为TextBlock(控件),绑定目标属性值为Text;定源为TextBox,绑定源属性值也为Text

在.xaml中看到绑定源的定义:


<TextBox Name="txtName" Grid.Row="0" Grid.Column="1"/>

   <TextBox Name="txtAge" Grid.Row="1" Grid.Column="1"/>


在.xaml中看到绑定目标:


<!--txtbName最为绑定目标,绑定源是txtName-->

 <TextBlock Name="txtbName" Text="{Binding ElementName=txtName, Path=Text}"/>

 <!--txtbAge最为绑定目标,绑定源是txtAge-->

 <TextBlock Name="txtbAge" Text="{Binding ElementName=txtAge, Path=Text}"/>


生成的效果就是在输入框中输入姓名跟年龄,在下面的显示信息中就会同步更新,达到绑定效果,如图:

  

2.   绑定目标为TextBlock(控件),绑定目标属性值为Text和TextBox,属性值也为Text;绑定源是window.Resources中的静态资源,静态资源包括:CLR定义对象,样式等

在.xaml中绑定源是一个字符串常量:引用命名空间


xmlns:sys1="clr-namespace:System;assembly=mscorlib"

<sys1:String x:Key="Name">sunjipeng</sys1:String>


在.xaml中绑定目标:

<!--txtbName最为绑定目标,绑定源是静态资源中的Name-->


<TextBlock Name="txtbName" Text="{StaticResource Name}"/>


效果如图:


 

绑定源为.cs文件内容

1. 绑定目标为TextBlock(控件),绑定目标属性值为Text;绑定源为MyDataSource

自定义的类对象

在这种情况下又有两种实现方式,一种将自定义的类对象在.xaml中作为静态资源文件,然后再按照上面第二种情况去实现,这里就不累赘了。

还有一种是将自定义的类对象在后台.cs实例化后,赋值给绑定目标的数据上下文对象(DataContext):

.CS文件代码:


public BindingWindow()

        {

            InitializeComponent();

            MyDataSource data = new MyDataSource();

            txtbAge.DataContext = data;

        }


.xaml文件中代码:


<TextBlock Name="txtbAge" Text="{Binding Path=Age}"/>


效果如图:


注意:这种模式自定义类,如果是普通的类,则只能是数据源到绑定对象的更新通知,也就是说如果绑定目标更改,则不会自动更新到数据源。要想实现双向绑定,就必须让自定义类实现INotifyPropertyChanged更改通知机制,或者自定义依赖属性项

几种特殊的绑定类型

其实特殊绑定形式,也满足上面说的规律,只是针对个别特殊的绑定源对象的阐述,提醒。

1.  当你想将绑定源设置为CLR定义或自定义的枚举类型,并将枚举类型绑定到绑定目标

就如WPF中HorizontalAlignment枚举类型一样,值:left、center、Right、Stretch

这里我们直接在.XAML中资源中声明一个枚举类型,要用到OjectDataProvider类,用它通过反射机制反射出枚举类型的值,然后就绑定到绑定目标。


xmlns:sys1="clr-namespace:System;assembly=mscorlib"//命名空间


静态资源中绑定源定义:


<Window.Resources>

        <sys1:String x:Key="Name">sunjipeng</sys1:String>

        <ObjectDataProvider x:Key="HorizontalEnum" ObjectType="{x:Type sys1:Enum}" MethodName="GetNames">

            <ObjectDataProvider.MethodParameters>

                <x:TypeExtension TypeName="HorizontalAlignment"/>

            </ObjectDataProvider.MethodParameters>

        </ObjectDataProvider>

    </Window.Resources>


绑定目标中:


<ComboBox Name="comboxAlignment" Grid.Row="2" Grid.Column="1" ItemsSource="{Binding Source={StaticResource HorizontalEnum}}"/>


效果如图:

 

 

转载于:https://my.oschina.net/violetmoon/blog/168385

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值