WPF教程

  • 格式:pptx
  • 大小:142.45 KB
  • 文档页数:19

下载文档原格式

  / 19
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WPF入门培训——Binding
什么是数据绑定?
数据绑定是在应用程序 UI 与业务逻辑之间建立连接的过程。如 果绑定wenku.baidu.com有正确设置并且数据提供正确通知,则当数据更改其 值时,绑定到数据的元素会自动反映更改。数据绑定可能还意 味着如果元素中数据的外部表现形式发生更改,则基础数据可 以自动更新以反映更改。例如,如果用户编辑 TextBox 元素中 的值,则基础数据值会自动更新以反映该更改。
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}}} 在实体类中按照以下方式实现:
public class MyViewModel : NotifyPropertyChanged {
private int _myField; public int MyProperty { get { return _myField; } set { _myField = value; OnPropertyChanged("MyProperty"); } } }
<StackPanel> <StackPanel.DataContext> <local:Student Name="Tim" Age="29"/> </StackPanel.DataContext> <TextBox Text="{Binding Path=Name}"/> <TextBox Text="{Binding Path=Age}"/> </StackPanel>
基本数据绑定概念

触发源更新的原因
TwoWay 或 OneWayToSource 绑定侦听目标属性的更改,并将这些更改传播回源。这称为 更新源。 但是,源值是在您编辑文本的同时进行更新,还是在您结束编辑文本并将鼠标指针从文本 框移走后才进行更新呢? 绑定的 UpdateSourceTrigger 属性确定触发源更新的原因。 如果 UpdateSourceTrigger 值为 PropertyChanged,则 TwoWay 或 OneWayToSource 绑定 的右箭头指向的值会在目标属性更改时立刻进行更新。但是,如果 UpdateSourceTrigger 值为 LostFocus,则仅当目标属性失去焦点时,该值才会使用新值进行更新。 如果 UpdateSourceTrigger 值为Explicit,当应用程序调用UpdateSource时,该值才会使用新值 跟新。

触发目标属性更新的原因
若要检测源更改(适用于 OneWay 和 TwoWay 绑定),则源必须实现一种合适的属性更改 通知机制(如 INotifyPropertyChanged)。 INotifyPropertyChanged 接口是 WPF/Silverlight 开发中非常重要的接口, 它构成了 ViewModel 的基础, 数据绑定基本上都需要这个接口。 所以, 对它的实现也显得非常重 要。
为Binding指定源的几种方法
• • • •
• • • • •

把普通的CLR类型单个对象指定为Source:包括.NET Framework自带类型的对象 和用户自定义类型的对象。 把普通的CLR集合类型对象指定为Source:包括数组、List<T>、 ObservableCollection<T>等集合类型。 把ADO.NET数据对象指定为Source:包括DataTable和DataView等对象。 使用XmlDataProvider把XML数据指定为Source:一些WPF控件是级联式的 (TreeView, Menu等),我们可以把树状结构的XML数据作为源指定给与之关联 的Binding。 把依赖对象指定为Source:依赖对象不仅可以做为Binding的目标,也可以做源。 把容器的DataContext指定为Source:如果一个Binding找不到自己的Source那他 就会沿着这个UI树一直往上找,直到找到和Path对应的那个属性。 通过ElementName指定Source:XAML中通过对象的Name属性来找打对象,并把 该对象作为Source赋值给Binding。 通过Binding的RelativeSource属性相对的指定Source:当控件需要关注自己的、 自己容器的或者自己内部元素的某个值就需要使用这种办法 把ObjectDataProvider对象指定为Source:当数据源的数据不是通过属性而是通 过方法暴露给外界的时候,可以使用这两种对象来包装数据源再把它们指定为 Source 使用LINQ检索的到的数据对象作为Binding的Source:它可以作为列表类控件的 ItemSource使用
下面接贴出一种简单的实现方式, 希望能起到抛砖引玉的作用。
public class NotifyPropertyChanged : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { if (this.PropertyChanged != null) {
ADO.NET对象作为Binding的源
在.NET的开发中,我们使用ADO.NET类对数据库进行操作。常见 的工作是从数据库中把数据读取到DataTable中,在把DataTable 显示在UI列表控件里,而在WPF中又如何把Datatable对象绑定到 列表控件呢,请看一下代码:
Xaml: <ListBox x:Name=“lbDt"/> C#: DataTable dt = new DataTable(); dt.Columns.Add("Name"); dt.Rows.Add("tom1"); dt.Rows.Add("tom2"); dt.Rows.Add("tom3"); lbDt.ItemsSource = dt.DefaultView; lbDt.DisplayMemberPath = "Name"; 注意:DataTable不能直接拿来为ItemsSource赋值,不过,把DataTable对象放在一 个对象的DataContext属性里,并把ItemsSource与一个既没有指定Source有没有指 定Path的Binding关联起来时,Binding却能自动找到它的DefaultView并当作自己的 Source来使用。
基本数据绑定概念
不论要绑定什么元素,不论数据源的特性是什么,每个绑定都始终遵循下图所示的 模型:
如图所示,数据绑定实质上是绑定目标与绑定源之间的桥梁。该图演示以下基本的 WPF 数据绑定概念:
通常,每个绑定都具有四个组件:绑定目标对象、目标属性、绑定源,以及要使用 的绑定源中的值的路径。例如,如果要将 TextBox 的内容绑定到 Employee 对象的 Name 属性,则目标对象是 TextBox,目标属性是 Text 属性,要使用的值是 Name, 源对象是 Employee 对象。 目标属性必须为依赖项属性。大多数 UIElement 属性都是依赖项属性,而大多数依 赖项属性(除了只读属性)默认情况下都支持数据绑定。(只有 DependencyObject 类型可以定义依赖项属性,所有 UIElement 都派生自 DependencyObject。)
XML数据作为Binding的源
现代程序设计中大部分的数据传输都是使用XML的,因为大多数据传输都是基于 SOAP相关的协议,而SOAP又是通过将对象系列化为XML文本进行传输。XML是树 形结构的,所以XML可以方便的用于表示线性集合和树形结构数据。
Xaml: <ListView x:Name="listView" Height="150" Margin="5"> <ListView.View> <GridView> <GridViewColumn Header="Id" Width="80" DisplayMemberBinding="{Binding XPath=@Id}"></GridViewColumn> <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding XPath=Name}"></GridViewColumn> </GridView></ListView.View>
创建绑定

C#代码创建
假如存在一个类Student,其中有个Name属性。 Student stu = New Student(){Name=“Tom”}; Binding binding = new Binding(); binding.Source = stu; binding.Path = new PropertyPath(“Name”);
数据绑定的一种典型用法是将服务器或本地配置数据放置到窗 体或其他 UI 控件中。在 WPF 中,此概念得到扩展,包括了大 量属性与各种数据源的绑定。在 WPF 中,元素的依赖项属性可 以绑定到 CLR 对象(包括 ADO.NET 对象或与 Web 服务和 Web 属性相关联的对象)和 XML 数据。
BindingOperation.SetBinding(this.textBoxName, TextBox.TextProperty,binding);

XAML中使用Binding标记扩展实现
<Slider x:Name="sl" Maximum="100" Minimum="0"/>
<TextBox Text="{Binding ElementName=sl, Path=Value}"/>
Xaml: <ListBox x:Name="lbList"/> C#: List<Student> stus = new List<Student>(); stus.Add(new Student() { Name = "Tim", Age = 20 }); stus.Add(new Student() { Name = "Tom", Age = 21 }); stus.Add(new Student() { Name = "Bob", Age = 22 }); lbList.ItemsSource = stus; lbList.DisplayMemberPath = "Name";
集合对象作为列表的ItemsSource
WPF中的列表控件均派生自ItemsControl类,自然也就继承了 ItemsSource这个属性。ItemsSource属性可以接收一个 Ienumerable接口派生的实例作为自己的值。每个ItemsControl的 派生类都具有自己对应的条目容器。ItemsSource里存放的一条 条数据,要想把数据显示出来需要为他们穿上“外衣”,条目容 器就起到了外衣的作用。怎样让每件数据外衣与它对应的数据条 目关联起来呢?请看一下代码:
DataContext作为Binding的源
DataContext被定义在FrameworkElement类里,这个类是WPF控 件的基类,所以所有的WPF控件都有这个属性,而且这是一个依 赖属性,依赖属性有一个很重要的特点就是当你没有为控件的某 个依赖属性显示赋值时,控件会把自己容器的属性值借过来当作 自己的属性值。实际上属性值沿着UI元素树向下传递了。 例如,有个Student类,其中有Name,Age属性,请看以下代码:
基本数据绑定概念
绑定的数据流可以从数据目标流向数据源和/或从绑定源流向绑定目标。您可能 希望应用程序使用户可以更改数据并将数据传播回源对象。或者,您可能不希 望允许用户更新源数据。您可以通过设置 Binding 对象的 Mode 属性来对此进行 控制。上图演示不同类型的数据流。 OneWay 绑定导致对源属性的更改会自动更新目标属性,但是对目标属性的更 改不会传播回源属性。此绑定类型适用于绑定的控件为隐式只读控件的情况。 如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定 模式的系统开销。 TwoWay 绑定导致对源属性的更改会自动更新目标属性,而对目标属性的更改 也会自动更新源属性。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。 OneWayToSource 与 OneWay 绑定相反;它在目标属性更改时更新源属性。

相关主题