XWT - 数据绑定
什么是数据绑定?
数据绑定是在应用程序UI与业务逻辑之间建立连接的过程,当设置好绑定关系并提供正确通知方式后,数据值修改时,绑定到数据的元素会自动反应更改。
数据绑定实质上是目标与绑定源之间的桥梁,通常每个绑定都有四个组件:目标对象、目标属性、绑定源和绑定源的值的路径。比如要将Text的内容绑定到Person对象的name属性,目标对象就是Text组件、目标属性是text、绑定源的值是name,绑定源是Person对象。
在数据绑定中还有数据流方向概念,也就是数据在目标对象和数据源对象之间的交换过程,在实际的应用开发中,你可能希望UI值数据更改后将数据通知给源对象,有时又不允许用户随便更改源数据,你可以通过设置Binding对象的Mode属性进行控制。比如
Text="{Binding ElementName=theOneWayTextBox, Path=Text, Mode=OneWay}"
数据绑定支持多种数据流方向:
- OneWay: 更改源对象的属性会自动更新目标对象的属性,但是目标对象属性的更改不会传播回源对象属性。
- TwoWay: 更改源对象的属性会自动更新目标对象的属性,而目标对象的属性更改也会自动更新源对象属性。
- OneTime: 使用源对象属性初始化目标对象的属性,不再传播后续的更改(一次性的)。
若要检查资源的更改情况,源对象必须得提供属性更改通知机制(PropertyChangeSupport)
触发源对象更新的原因
使用TwoWay绑定监听目标对象属性的更改,并将这些更改传播给源对象,这称为更新源,但我们怎样指定在什么时候触发更新动作呢?比如在编辑文本框框内容时,是在编辑的时候更新还是在光标移开文本框后才进行更新呢?你可以使用UpdateSourceTrigger属性指定触发的条件
下面是UpdateSourceTrigger值的示例方案
UpdateSourceTrigger值 | 源对象值何时更新 | 应用场景 |
LostFocus | 但Text组件失去焦点时 | 验证逻辑 |
PropertyChanged | 修改Text组件内容时 | 用于聊天窗口输入框(显示用户输入清空) |
Explicit | 应用程序调用UpdateSource时 | 可修改的Text组件,点击提交按钮才更新数据源值 |
创建绑定
XWT提供了Binding对象建立绑定关系,下面将了解一下如何设置绑定。
下面这个例子绑定了Person的类,该类在org.eclipse.e4.xwt.tests.databinding这个命名空间中定义。Person有个age的int类型属性,默认为10.
<Shell xmlns="http://www.eclipse.org/xwt/presentation" xmlns:x="http://www.eclipse.org/xwt"
xmlns:y="clr-namespace:org.eclipse.e4.xwt.tests.databinding" Size="400, 300"
DataContext="{StaticResource myData}">
<Shell.layout>
<GridLayout numColumns="3" />
</Shell.layout>
<Shell.Resources>
<y:Person x:Key="myData" />
</Shell.Resources>
<Label text="Name" />
<Text x:style="BORDER" text="{Binding Path=age}">
<Text.layoutData>
<GridData horizontalAlignment="FILL" grabExcessHorizontalSpace="true" />
</Text.layoutData>
</Text>
<Label text="{Binding Path=age}">
<Label.layoutData>
<GridData horizontalAlignment="FILL" grabExcessHorizontalSpace="true" />
</Label.layoutData>
</Label>
</Shell>
数据绑定提供了默认的类型转换。默认采用OnWay方式。
运行