WPF中的数据绑定提供了很强大的功能。与普通的WinForm程序相比,其绑定功能为我们提供了很多便利,例如Binding对象的自动通知/刷新,Converter,Validation Rules,Two Way Binding等功能,省去了很多维护的繁琐工作。另外对于WPF中提供的数据模板功能,让我们可以轻松定制可以被复用的控制呈现的模块—但这是以数据绑定为前提来做到轻松易用的效果的。数据提供者例如XmlDataProvider和ObjectDataProvider更是简化了将对象以特定方式绑定并呈现的过程。可以说,数据绑定是WPF中让我们真正能够开始体现其便利性的特征之一,而对以数据驱动的应用来讲,其重要性不言而喻。
数据绑定的关键是System.Windows.Data.Binding对象,它会把两个对象(UI对象与UI对象之间,UI对象与.NET数据对象之间)按照指定的方式粘合在一起,并在他们之间建立一条通信通道,绑定一旦建立,接下来的应用生命周期中它可以自己独立完成所有的同步工作。根据其应用场合的不同我们将在本文中从以下几个部分分别讨论:
· 对象间的绑定
· 绑定到集合
· 数据模板
· 向绑定添加规则和转换器
1. UI对象间的绑定
UI对象间的绑定,也是最基本的形式,通常是将源对象Source的某个属性值绑定 (拷贝) 到目标对象Destination的某个属性上。源属性可以是任意类型,但目标属性必须是依赖属性(Dependency Property)。通常情况下我们对于UI对象间的绑定源属性和目标属性都是依赖属性 (有些属性不是) ,因为依赖属性有垂直的内嵌变更通知机制,WPF可以保持目标属性和源属性的同步。
看个简单的例子是如何在XAML中实现数据绑定的:
<Window x:Class="WpfApplication1.数据绑定测试"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="数据绑定测试" Height="400" Width="400">
<Grid>
<StackPanel>
<TextBox x:Name="txtName" Margin="5" Width="400" Text="Source Element ce shi"></TextBox>
<TextBlock x:Name="tbShowMessage" Margin="5" Width="400" Text="{Binding ElementName=txtName, Path=Text}" />
<Button Content="测试XAML绑定" Click="btnBasicBinding_Click"></Button>
</StackPanel>
</Grid>
</Window>
· XAML绑定语法:
上边的代码我们将名为txtName的对象的Text属性作为源对象分别绑定给了两个TextBlock的Text属性。这里我们用了Binding关键字并指定了ElementName和Path,这两个就是指定源对象(Source)和源属性(Source Property). 通常我们在设定绑定时都用与StaticResource标记类似的语法{Binding… }并设置ElementName和Path属性:
Text=”{Binding ElementName=SourceObjectName, Path=SourceProperty}”
如:Text="{Binding ElementName=txtName, Path=Text}"
· 用Coding(C#)添加Binding
而对于C#里和绑定相关的代码,则看起来会罗嗦很多。但它们都同样的使用了Binding对象,然后指定PropertyPath的一个实例为源属性,然后可以有两个方法来加载绑定规则:
1. 调用FrameworkElement 或FrameworkContentElement对象的SetBinding方法
2. 调用BindingOperations.SetBinding静态方法
以下代码实现了和上边XAML文件类似的功能:
namespace WpfApplication1
{
public partial class 数据绑定测试 : Window
{
public 数据绑定测试()
{
InitializeComponent();
}
private void btnBasicBinding_Click(object sender, RoutedEventArgs e)
{
this.txtName.Text = "this is a test";
Binding binding = new Binding();
//设置源对象
binding.Source = txtName;
//设置源属性
binding.Path = new PropertyPath("Text");
//添加到目标属性
this.tbShowMessage.SetBinding(TextBlock.TextProperty,binding);
//or
//BindingOperations.SetBinding(tbShowMessage, TextBlock.TextProperty, binding);
}
}
}
· 用Coding(C#)移除Binding
当你在应用程序中某个地方添加了绑定,而在某个时候又不想这个绑定在接下来继续有效时,你可以有两种方式来断开这个绑定:
1. 用BindingOperations.ClearBinding静态方法。
例如BindingOperations.ClearBinding(currentTextBlock, TextBlock.TextProperty); BindingOperations同时还提供了ClearAllBindings方法,只需要传入要清除绑定的目标对象的名称,它就会将所有这个对象的绑定移除。
如上面的为:
BindingOperations.ClearBinding(tbShowMessage, TextBlock.TextProperty);
· Binding对象的属性
Property Description
Converter 转换器
ElementName 绑定的源对象
FallbackValue 绑定无法返回有效值时的默认显示。
Mode 绑定方式
Path 属性
RelativeSource 常用于自身绑定或者数据模板中来指定绑定的源对象。
Source 源对象
StringFormat 格式化表达式
UpdateSourceTrigger Sets the events on which binding will occur.
ValidationRules 验证规则
2. 简单的将目标属性设置为一个新的值。
这个简单的方法同样有效,可以断开与前边设置的binding的连接。简单的设置为任何值即可:如:currentTextBlock.Text = “it’s a new value.”;
总结:对于对象间的绑定,绑定源为ElementName,Path为绑定源属性。ElementName必须为以下可选项之一:
DataContext
DataContext是WPF最后才试图查找的源。一旦RelativeSource和Source对象都没有被设置,则会在逻辑树种向上搜寻。
RelativeSource
用来标识和当前控件关联的对象,通常用于自我引用或数据模板。
Source
数据提供者/对象
2. 绑定到集合
· 利用ItemsSource来绑定数据源
常用标记:{Binding Path =””} ItemSource DisplayMemberPath
通常来说这是我们在做以数据驱动为主的应用时最经常用到的绑定方式。WPF支持任何类型的.NET对象作为数据源绑定到WPF对象。对于所有的ItemsControl对象都有一个ItemsSource依赖属性,这是专门为数据绑定而准备的。ItemsSource的类型是IEnumerable,所以对于我们几乎所有的集合类型我们都可以轻易的改变成ItemsSource的源对象。通过以下语句我们可以将一个名为photos的集合赋予ListBox对象,并以显示Name属性的值:
<ListBox x:Name=”pictureBox” DisplayMemberPath=”Name”
ItemsSource=”(Binding {DynamicResource photos}”
我们知道,依赖属性内建的垂直通知功能让UI对象间的绑定可以自己负责同步处理,但是对于.NET集合/对象来讲,它不具备这样的能力。为了让目标属性与源集合的更改保持同步,源集合必须实现一个叫INotifyCollectionChanged的接口,但通常我们只需要将集合类继承于ObservableCollection类即可。因为ObservableCollection实现了INotifyPropertyChanged和INotifyCollectionChanged接口。示例代码中我们这么去定义Photos集合类:
public class Photos : ObservableCollection<Photo>
数据绑定的关键是System.Windows.Data.Binding对象,它会把两个对象(UI对象与UI对象之间,UI对象与.NET数据对象之间)按照指定的方式粘合在一起,并在他们之间建立一条通信通道,绑定一旦建立,接下来的应用生命周期中它可以自己独立完成所有的同步工作。根据其应用场合的不同我们将在本文中从以下几个部分分别讨论:
· 对象间的绑定
· 绑定到集合
· 数据模板
· 向绑定添加规则和转换器
1. UI对象间的绑定
UI对象间的绑定,也是最基本的形式,通常是将源对象Source的某个属性值绑定 (拷贝) 到目标对象Destination的某个属性上。源属性可以是任意类型,但目标属性必须是依赖属性(Dependency Property)。通常情况下我们对于UI对象间的绑定源属性和目标属性都是依赖属性 (有些属性不是) ,因为依赖属性有垂直的内嵌变更通知机制,WPF可以保持目标属性和源属性的同步。
看个简单的例子是如何在XAML中实现数据绑定的:
<Window x:Class="WpfApplication1.数据绑定测试"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="数据绑定测试" Height="400" Width="400">
<Grid>
<StackPanel>
<TextBox x:Name="txtName" Margin="5" Width="400" Text="Source Element ce shi"></TextBox>
<TextBlock x:Name="tbShowMessage" Margin="5" Width="400" Text="{Binding ElementName=txtName, Path=Text}" />
<Button Content="测试XAML绑定" Click="btnBasicBinding_Click"></Button>
</StackPanel>
</Grid>
</Window>
· XAML绑定语法:
上边的代码我们将名为txtName的对象的Text属性作为源对象分别绑定给了两个TextBlock的Text属性。这里我们用了Binding关键字并指定了ElementName和Path,这两个就是指定源对象(Source)和源属性(Source Property). 通常我们在设定绑定时都用与StaticResource标记类似的语法{Binding… }并设置ElementName和Path属性:
Text=”{Binding ElementName=SourceObjectName, Path=SourceProperty}”
如:Text="{Binding ElementName=txtName, Path=Text}"
· 用Coding(C#)添加Binding
而对于C#里和绑定相关的代码,则看起来会罗嗦很多。但它们都同样的使用了Binding对象,然后指定PropertyPath的一个实例为源属性,然后可以有两个方法来加载绑定规则:
1. 调用FrameworkElement 或FrameworkContentElement对象的SetBinding方法
2. 调用BindingOperations.SetBinding静态方法
以下代码实现了和上边XAML文件类似的功能:
namespace WpfApplication1
{
public partial class 数据绑定测试 : Window
{
public 数据绑定测试()
{
InitializeComponent();
}
private void btnBasicBinding_Click(object sender, RoutedEventArgs e)
{
this.txtName.Text = "this is a test";
Binding binding = new Binding();
//设置源对象
binding.Source = txtName;
//设置源属性
binding.Path = new PropertyPath("Text");
//添加到目标属性
this.tbShowMessage.SetBinding(TextBlock.TextProperty,binding);
//or
//BindingOperations.SetBinding(tbShowMessage, TextBlock.TextProperty, binding);
}
}
}
· 用Coding(C#)移除Binding
当你在应用程序中某个地方添加了绑定,而在某个时候又不想这个绑定在接下来继续有效时,你可以有两种方式来断开这个绑定:
1. 用BindingOperations.ClearBinding静态方法。
例如BindingOperations.ClearBinding(currentTextBlock, TextBlock.TextProperty); BindingOperations同时还提供了ClearAllBindings方法,只需要传入要清除绑定的目标对象的名称,它就会将所有这个对象的绑定移除。
如上面的为:
BindingOperations.ClearBinding(tbShowMessage, TextBlock.TextProperty);
· Binding对象的属性
Property Description
Converter 转换器
ElementName 绑定的源对象
FallbackValue 绑定无法返回有效值时的默认显示。
Mode 绑定方式
Path 属性
RelativeSource 常用于自身绑定或者数据模板中来指定绑定的源对象。
Source 源对象
StringFormat 格式化表达式
UpdateSourceTrigger Sets the events on which binding will occur.
ValidationRules 验证规则
2. 简单的将目标属性设置为一个新的值。
这个简单的方法同样有效,可以断开与前边设置的binding的连接。简单的设置为任何值即可:如:currentTextBlock.Text = “it’s a new value.”;
总结:对于对象间的绑定,绑定源为ElementName,Path为绑定源属性。ElementName必须为以下可选项之一:
DataContext
DataContext是WPF最后才试图查找的源。一旦RelativeSource和Source对象都没有被设置,则会在逻辑树种向上搜寻。
RelativeSource
用来标识和当前控件关联的对象,通常用于自我引用或数据模板。
Source
数据提供者/对象
2. 绑定到集合
· 利用ItemsSource来绑定数据源
常用标记:{Binding Path =””} ItemSource DisplayMemberPath
通常来说这是我们在做以数据驱动为主的应用时最经常用到的绑定方式。WPF支持任何类型的.NET对象作为数据源绑定到WPF对象。对于所有的ItemsControl对象都有一个ItemsSource依赖属性,这是专门为数据绑定而准备的。ItemsSource的类型是IEnumerable,所以对于我们几乎所有的集合类型我们都可以轻易的改变成ItemsSource的源对象。通过以下语句我们可以将一个名为photos的集合赋予ListBox对象,并以显示Name属性的值:
<ListBox x:Name=”pictureBox” DisplayMemberPath=”Name”
ItemsSource=”(Binding {DynamicResource photos}”
我们知道,依赖属性内建的垂直通知功能让UI对象间的绑定可以自己负责同步处理,但是对于.NET集合/对象来讲,它不具备这样的能力。为了让目标属性与源集合的更改保持同步,源集合必须实现一个叫INotifyCollectionChanged的接口,但通常我们只需要将集合类继承于ObservableCollection类即可。因为ObservableCollection实现了INotifyPropertyChanged和INotifyCollectionChanged接口。示例代码中我们这么去定义Photos集合类:
public class Photos : ObservableCollection<Photo>
发表评论
-
C# 事件 示例 源代码
2011-11-18 09:28 1103using System; using System.Coll ... -
关于Installshield 打包框架 和 水晶报表 WPF等有用链接
2011-11-11 15:38 1842http://download.csdn.net/detail ... -
C# 失去焦点
2011-11-07 09:04 2084最近根据用户需求,对项目的一点不大合适的地方做了一下 ... -
Panel内容模型
2011-11-16 14:58 1176一、Panel内容模型 Panel ... -
使用Items属性
2011-10-20 16:45 1608随 WPF 附带的每个 ItemsControl 具有一个对应 ... -
ItemsControl模型
2011-10-20 16:41 1229从 ItemsControl 继承的控件包含一个对象集合。 I ... -
HeaderedContentControl模型
2011-10-20 16:39 1351HeaderedContentControl类继承Conten ... -
WPF内容控件详解
2011-10-20 16:37 2117一、ContentControl模型 ContentContr ... -
WPF控件内容模型
2011-10-20 16:30 1475WPF控件内容模型主要指派生于System.Windows.C ... -
创建你的第一个WPF项目
2011-10-10 16:47 2023WPF基础知识 快速学习绝 ... -
什么是WPF 及WPF的未来
2011-10-10 15:27 1652Windows Presentation Foundation ... -
水晶报表中的子报表中的页眉页脚的创建 .
2011-10-09 10:48 21481.页眉的显示 打开水晶报表的子报表后,在IDE左侧的“字段资 ... -
C# 多个窗体之间查找控件
2011-10-08 17:18 49821.在Form5 中 放一个分隔Panel,加载的时候显示一个 ...
相关推荐
在Windows Presentation Foundation (WPF) 中,数据绑定是将用户界面(UI)元素与应用程序的数据模型连接起来的关键机制。这使得UI可以动态地反映数据的变化,反之亦然。本示例将详细介绍WPF中的五种数据绑定方式:...
**WPF学习数据绑定的例子** 在Windows Presentation Foundation (WPF)中,数据绑定是一种强大的机制,它使得用户界面(UI)元素可以直接与数据源进行交互,实现了数据和UI之间的同步更新。这个例子旨在帮助初学者理解...
在WPF中,数据绑定是基于MVVM(Model-View-ViewModel)设计模式的核心部分,它允许视图(View)与数据模型(Model)进行通信。绑定`TreeView`通常涉及以下几个步骤: 1. **定义数据结构**:`TreeView`的数据源通常...
与传统的WinForm相比,WPF在很多方面都有显著提升,其中数据绑定机制是其核心优势之一。数据绑定允许开发者将UI元素直接与数据源连接,使得数据的变化能够实时反映到UI上,反之亦然,从而简化了UI与业务逻辑之间的...
在Windows Presentation Foundation(WPF)中,数据绑定是一种强大的机制,它允许UI元素与应用程序的数据模型...通过这个“WPF简单数据绑定demo”,新手可以逐步学习并实践这些概念,为后续的WPF开发打下坚实的基础。
**WPF MVVM 数据绑定详解** 在Windows Presentation Foundation(WPF)中,MVVM(Model-View-ViewModel)设计模式是一种广泛使用的架构模式,它强调将应用程序的逻辑、用户界面和数据模型分离,以实现更好的可测试...
在WPF(Windows Presentation Foundation)开发中,数据绑定和命令是两个非常重要的概念,它们能够实现界面(View)与业务逻辑(ViewModel)之间的松耦合。让我们深入探讨这两个主题。 **WPF数据绑定(Binding)** ...
这些示例涵盖了数据绑定的广泛使用场景,从简单的属性绑定到复杂的多源绑定和条件触发,它们提供了丰富的学习材料,帮助开发者深入理解并熟练掌握WPF中的数据绑定技术。通过使用这些示例,开发者可以更好地设计和...
本篇文章将深入探讨如何在WPF应用中实现DataGrid嵌入ComboBox并进行数据绑定。 首先,我们需要理解WPF中的数据绑定概念。数据绑定允许UI元素(如ComboBox和DataGrid)与应用程序中的数据源进行连接,使UI动态反映...
首先,数据绑定是WPF的核心特性之一,它简化了UI与业务逻辑之间的通信。在WPF中,我们可以将一个对象的属性直接绑定到UI元素,当对象属性改变时,UI会自动更新,反之亦然。这使得开发人员能够专注于业务逻辑,而不是...
在Windows Presentation Foundation(WPF)中,数据绑定是一种强大的机制,它允许开发者将用户界面(UI)元素与数据源关联起来,实现数据的自动更新。本教程将详细讲解如何解析XML文档并将其内容绑定到WPF UI前台,...
在WPF中,数据绑定是核心特性之一,它允许UI元素与应用程序的数据模型进行直接关联,从而实现数据驱动的界面更新。 **Visifire**是一个开源的数据可视化库,专为WPF设计,用于创建高质量的2D和3D图表。它支持多种...
在Windows Presentation Foundation (WPF) 中,自定义控件的创建是通过继承现有的UI元素或者组合多个...这个案例提供了学习和实践WPF自定义控件、数据绑定以及动态样式改变的良好机会,对于提升WPF开发技能非常有帮助。
在“Windows Vista培训系列课程(6):WPF之数据绑定”中,你将深入学习如何有效地运用这些技巧,创建动态、响应式的用户界面。通过观看WebCast20061222pm_Video.wmv这个视频文件,你可以直观地了解和掌握WPF数据绑定...
在C# WPF(Windows Presentation Foundation)开发中,数据绑定是一项核心特性,它极大地简化了UI(用户界面)与...通过对这些案例的学习和实践,你将能更好地掌握C# WPF的数据绑定技术,并将其应用到自己的项目中。
总的来说,“WPF数据绑定、分页及购物车实现”这个项目为学习者提供了一个实践这些概念的完整环境。下载后的Product_Proj文件应包含了实现这些功能的所有代码和资源,只需更改数据库连接字符串即可运行。通过这个...
标题中的“WPF纯MVVM事件绑定+事件参数 完美示例”意味着我们将学习如何在不违反MVVM原则的情况下处理控件事件,以及如何传递和使用事件参数。 首先,要实现事件绑定,我们需要引用`System.Windows.Interactivity`...
这个项目综合运用了WPF的强大功能,为开发者提供了一个学习和实践数据绑定、自定义属性、模板设计和数据触发器的好例子。通过深入研究此项目,开发者可以更好地理解和掌握WPF中数据驱动UI的设计理念,提高开发效率并...
数据绑定是WPF的核心特性之一,它允许UI元素与应用程序数据模型进行自动同步。通过数据绑定,开发者无需手动更新UI,只需更新数据源,UI就会自动反映出数据的变化。这极大地简化了代码,提高了可维护性。在WPF中,...