- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章WPF的数据绑定详细介绍由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、WPF数据绑定的概要 。
数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程。 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改。 数据绑定可能还意味着如果视觉元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改.
例如:如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改.
。
1. 数据绑定涉及到两个方面:
一个是绑定源,一个是绑定目标。绑定源即控件绑定所使用的源数据,绑定目标即数据显示的控件.
2. 对于绑定源,在WPF可以是以下四种:
•CLR对象:可以绑定到CLR类的公开的属性、子属性、索引器上。 •ADO.Net对象:例如DataTable、DataView等 。 •XML文件:使用XPath进行解析 。 •DependencyObject:绑定到其依赖项属性上,即控件绑定控件 。 对于绑定目标,必须是WPF中的DependencyObject,将数据绑定到其依赖项属性上.
。
2、 绑定的模式 。
1. 根据数据流的方向,WPF中的数据绑定分为以下四种:
OneWay 绑定:对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。此绑定类型适用于绑定的控件为隐式只读控件的情况.
TwoWay 绑定:对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案 .
OneWayToSource 与 OneWay 相反;它在目标属性更改时更新源属性.
OneTime绑定:该绑定会导致源属性初始化目标属性,但不传播后续更改.
注释:如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销.
大多数属性都默认为 OneWay 绑定,但是一些依赖项属性,通常为用户可编辑的控件的属性,如 TextBox 的 Text 属性和 CheckBox 的 IsChecked 属性,默认为 TwoWay 绑定.
如果要知道依赖项属性绑定在默认情况下是单向还是双向的编程方法可使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值.
示例代码:
。
<Page x:Class="WpfDemo.Page1" 。
。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 。
/> 根据程序执行结果,我们可以得到以下结论:
。
对于OneWay绑定:在界面中显示的数据可以随数据源的值的变化而变化,但更改界面的数据不会影响到数据源.
对于TwoWay绑定:界面中显示的数据及数据源的数据可以双向显示及更新.
对于OneWayToSource绑定:初始时界面的数据为空;更改界面的数据可以影响数据源的值,但是更改数据源的值不会体现在界面上.
对于OneTime绑定:在界面中显示的为数据源的初始值,更改数据源的值的时候,不会更改界面的数据显示;更改界面的数据也不会影响到数据源的数据.
。
3、绑定目标值影响绑定源值条件 。
问题:绑定源的值是在您编辑文本的同时进行更新,还是在您结束编辑文本并将鼠标指针从文本框移走后才进行更新呢?或者在您需要更新的情况下在手动的更新呢?
1. UpdateSourceTrigger 属性是确定触发源更新的原因.
下图中右箭头的点演示 UpdateSourceTrigger 属性的角色:
TwoWay及OneWayToSource是由绑定目标到绑定源方向,若实现绑定目标的值更改影响绑定源的值方式,只需要设置相应控件绑定时的UpdateSourceTrigger的值,其值有三种:
PropertyChanged:当绑定目标属性更改时,立即更新绑定源.
LostFocus:当绑定目标元素失去焦点时,更新绑定源.
Explicit:仅在调用 UpdateSource 方法时更新绑定源.
注释:多数依赖项属性的UpdateSourceTrigger 值的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus.
。
2. 示例 。
。
XAML:
。
。
<Page x:Class="WpfDemo.Changed" 。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 。
style="margin: 3px auto 0px; padding: 0px 3px; outline: none; line-height: 25.2px; font-size: 14px; background: rgb(242, 246, 251); width: 640px; clear: both; border-top: 1px solid rgb(0, 153, 204); border-right: 1px solid rgb(0, 153, 204); border-left: 1px solid rgb(0, 153, 204); border-image: initial; border-bottom: none; font-family: tahoma, arial, "Microsoft YaHei";"> 复制代码代码如下
C#
。
namespace WpfDemo 。
{ 。
public partial class Changed : Page 。
{ 。
#region properties 。
public UserModel CurrentUser 。
{ 。
get;set,
} 。
#endregion 。
#region Constructor 。
public Changed() 。
{ 。
InitializeComponent(),
this.Loaded += new RoutedEventHandler(Changed_Loaded),
this.btnChanged.Click += new RoutedEventHandler(btnChanged_Click),
} 。
#endregion 。
#region Changed_Loaded 。
void Changed_Loaded(object sender, RoutedEventArgs e) 。
{ 。
this.CurrentUser = new UserModel() {UserName="swd"},
this.DataContext = this.CurrentUser,
} 。
#endregion 。
#region btnLogon_Click 。
void btnChanged_Click(object sender, RoutedEventArgs e) 。
{ 。
this.txtExplicit.GetBindingExpression(TextBox.TextProperty).UpdateSource(),
} 。
#endregion 。
} 。
public class UserModel 。
{ 。
public string UserName 。
{ 。
get;set;} 。
} 。
} 。
。
程序执行结果如上所述.
。
4、 数据提供程序 。
1. XmlDataProvider
XmlDataProvider访问 XML 数据的方式有以下三种:
可以使用 XmlDataProvider 类嵌入内联 XML 数据.
可以将 Source 属性设置为 XML 数据文件的 Uri.
可以将 Document 属性设置为 XmlDocument.
注释:当 XmlDocument.NodeChanged 事件发生时,XmlDataProvider 执行所有绑定的完全刷新。 特定节点不进行优化.
默认情况下,XmlDataProvider.IsAsynchronous 属性设置为 true,表示默认情况下 XmlDataProvider 检索数据并异步生成 XML 节点的集合.
以下将介绍使用上面所述的三种方式显示xml数据:
示例 。
。
Xaml
。
<Page x:Class="WpfDemo.xmlBinding" 。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 。
style="margin: 3px auto 0px; padding: 0px 3px; outline: none; line-height: 25.2px; font-size: 14px; background: rgb(242, 246, 251); width: 640px; clear: both; border-top: 1px solid rgb(0, 153, 204); border-right: 1px solid rgb(0, 153, 204); border-left: 1px solid rgb(0, 153, 204); border-image: initial; border-bottom: none; font-family: tahoma, arial, "Microsoft YaHei";"> 复制代码代码如下
XML
。
<?xml version="1.0" encoding="utf-8" ?> 。
<Students> 。
<Student> 。
<name>swd</name> 。
<score>110</score> 。
</Student> 。
<Student> 。
<name>asd</name> 。
<score>120</score> 。
</Student> 。
<Student> 。
<name>awd</name> 。
<score>130</score> 。
</Student> 。
</Students> 。
通过以上示例我想大家应该很容易理解与应用.
2. ObjectDataProvider
。
ObjectDataProvider 使您能够在 XAML 中创建可用作绑定源的对象,并为您提供以下属性,以对对象执行查询并绑定到结果.
使用 ConstructorParameters 属性将参数传递给对象的构造函数.
使用 MethodName 属性调用一个方法.
使用 MethodParameters 属性将参数传递给该方法。 然后,可以绑定到该方法的结果.
使用ObjectType 指定将提供数据绑定源的对象.
使用 ObjectInstance 属性来指定现有的对象实例作为源 。
注释:还可以使用 IsAsynchronous 属性指定是在辅助线程还是在活动上下文中执行对象创建。也就是是否异步检索数据.
示例
。
XAML
。
C#
namespace WpfDemo 。
{ 。
#region CObjectDataProvider 。
public partial class CObjectDataProvider : Page 。
{ 。
public CObjectDataProvider() 。
{InitializeComponent();} 。
} 。
#endregion 。
#region Country 。
public class Country 。
{ 。
#region Name 。
public string Name 。
{get;set;} 。
#endregion 。
#region ProvinceList 。
public List<Province> ProvinceList 。
{get;set;} 。
#endregion 。
#region GetAllCity 。
public static List<Country> GetAllCity() 。
{ 。
return new List<Country>{ 。
new Country 。
{ 。
Name = "中国".
ProvinceList = new List<Province> 。
{ 。
new Province{ Name="福建省".
CityList=new List<City>{new City{Name="福州市"},new City{Name="厦门市"},new City{Name="漳州市"},new City{Name="泉州市"}} 。
}.
new Province{Name="江苏省".
CityList=new List<City>{ 。
new City{Name="苏州市"},new City{Name="南京市"},new City{Name="扬州市"},new City{Name="无锡市"}} 。
}.
new Province{Name="江西省".
CityList=new List<City>{new City{Name="南昌市"},new City{Name="九江市"}}}} 。
} 。
},
} 。
#endregion 。
} 。
#endregion 。
#region Province 。
public class Province 。
{ 。
#region Name 。
public string Name 。
{get;set;} 。
#endregion 。
#region CityList 。
public List<City> CityList 。
{get;set;} 。
#endregion 。
} 。
#endregion 。
#region City 。
public class City 。
{ 。
#region Name 。
public string Name 。
{get;set;} 。
#endregion 。
} 。
#endregion 。
} 。
。
5、类型转换与数据校验 。
1. IValueConverter接口 。
提供一种将自定义逻辑应用于绑定的方式.
在Binding时,数据源对象到目标对象之间(或者目标对象到数据源对象)可能需要某种转换。这时只需实现IValueConverter接口自定义值转换器即可.
接口原型定义:
public interface IValueConverter { object Convert(object value, Type targetType, object parameter, CultureInfo culture); object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture); } 。
参数value是要转换的值,typeTarget是转换后的值类型,parameter是Binding 类的 ConverterParameter传递过来的参数.
Convert方法:数据绑定引擎在将值从绑定源传播给绑定目标时,调用此方法.
ConvertBack方法:数据绑定引擎在将值从绑定目标传播给绑定源时,调用此方法.
ValueConversion属性作用是告诉自定义转换器类可以转换的源数据和目标数据的 类型(ValueConversion属性将在稍后的示例中看到).
2. ValidationRule类 。
提供一种为检查用户输入的有效性而创建自定义规则的方法.
ValidationRule : 所有自定义验证规则的基类。提供了让用户定义验证规则的入口.
ExceptionValidation :表示一个规则,该规则检查在绑定源属性更新过程中引发的异常。它是一个内置的规则,它检查在绑定源属性更新过程中引发的异常.
ValidationResult : 数据验证结果的表现方式。ValidationRule对象的Validate方法执行完毕后通过ValidationResult来表示验证的结果。这里包含了错误信息—ErrorContent,数据是否有效—IsValid。ValidResult 为 ValidationResult 的有效实例.
ValidationError :表示一个验证错误,该错误在 ValidationRule 报告验证错误时由绑定引擎创建.
。
XAML
。
<Page x:Class="WpfDemo.TypeConvertAndValidationRule" 。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 。
style="margin: 3px auto 0px; padding: 0px 3px; outline: none; line-height: 25.2px; font-size: 14px; background: rgb(242, 246, 251); width: 640px; clear: both; border-top: 1px solid rgb(0, 153, 204); border-right: 1px solid rgb(0, 153, 204); border-left: 1px solid rgb(0, 153, 204); border-image: initial; border-bottom: none; font-family: tahoma, arial, "Microsoft YaHei";"> 复制代码代码如下
C#
。
namespace WpfDemo 。
{ 。
#region TypeConvertAndValidationRule 。
public partial class TypeConvertAndValidationRule : Page 。
{ 。
public TypeConvertAndValidationRule() 。
{ 。
InitializeComponent(),
this.DataContext = new UserInfo { Name = "swd", Birthday =System.Convert.ToDateTime("1987/10/21"), EMail = "swd@126.com" },
} 。
} 。
#endregion 。
#region UserInfo 。
public class UserInfo 。
{ 。
#region Name 。
public string Name 。
{get;set;} 。
#endregion 。
#region Birthday 。
public DateTime Birthday 。
{get;set;} 。
#endregion 。
#region EMail 。
private string email,
public string EMail 。
{ 。
get 。
{return email;} 。
set 。
{ 。
this.email = value,
Regex r = new Regex(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"),
if (!r.IsMatch(value)) 。
{ 。
throw new ApplicationException("电子邮件格式有误!"),
} 。
} 。
} 。
#endregion 。
} 。
#endregion 。
。
6、 绑定集合对象 。
1. ICollectionView接口 。
允许集合具有当前记录管理、自定义排序、筛选和分组这些功能。比如排序,分组,筛选,导航以及其它自定义视图,并且这不会影响到你的后台数据的实际存储.
2. ObservableCollection <T> 类 。
表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知.
3. WPF MVVM概要 。
MVVM(Model-View-ViewModel)是由MVC,MVP演变而来。MVVM分离了逻辑与界面,解放业务逻辑.
最后此篇关于WPF的数据绑定详细介绍的文章就讲到这里了,如果你想了解更多关于WPF的数据绑定详细介绍的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 foo 类,它有一个 bar 方法,它接受可调用的东西(函数指针/仿函数)。这个可调用的东西应该作为绑定(bind)元素传递给另一个方法 doit 和第三个方法 bar_cb 方法。 #in
我正在尝试在我的 WPF 4.0 应用程序(使用 VS 2010 Pro RTM)中创建自定义 TabItem 模板/样式,但尽管一切似乎都正常工作,但我注意到跟踪窗口中存在绑定(bind)错误。 我
作为一名刚接触 Android 的开发人员,我想我可能误解了绑定(bind)服务。 我创建了一项服务来结束对服务器的访问。作为此服务的一部分,该服务正在监听多播地址,以识别本地网络上的设备何时出现和消
这个问题在这里已经有了答案: What is the use of the JavaScript 'bind' method? (23 个回答) 关闭 7 年前。 所以我一直在尝试了解一些 JS 上
我不明白这三种语法之间的区别: where a = f (b) do a <- f (b) do let a = f (b) 我确实明白了a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有
我在将 Cocoa 项目从手动同步接口(interface)模型转换为绑定(bind)模型时遇到问题,这样我就不必担心接口(interface)粘合代码。 我关注了 CocoaDevCentral C
我正在尝试找出一种好的方法来对处理大数据集的代码进行并行化,然后将结果数据导入 RavenDb。 数据处理受 CPU 限制和数据库导入 IO 限制。 我正在寻找一种解决方案,以对 Environmen
我正在 foreach 循环中生成单选按钮。我试图将选中的属性绑定(bind)到父级中的基本可观察值。不幸的是,当单击单选按钮时,父级的属性似乎没有在单击处理程序中更新。 基于一些previous w
在我的 Windows Phone 应用程序中,我有两个 LongListSelectors并排在页面上。我想做到这一点,以便当用户滚动其中一个时,另一个滚动相同的量。 两个 LongListSele
我在网上看到这个问题准备面试: Given a non-preemptive kernel which type of process will get affected morein terms o
我有一个 foreach 绑定(bind),如下所示: Summary Permitting 原因是有两个选项卡始终存在,并且我根据是否添加了其他选项卡来添加其他选项
任何人都有绑定(bind)相同的情况DataContext到 TextBlock 中的 Text 属性(例如)。 我必须分配 DataContext以我的风格反射(reflect)基于 Datacon
给定以下代码: Login 和下面的javascript $(function () { $('#btnLogin').click(function () { co
我使用 boost::asio 创建了一个服务器。我在绑定(bind)到端点时遇到问题。所以,如果我在构造函数中初始化一个接受器: Server::Server(QWidget *parent) :
我正在将现有项目从 MySQL 转换为 Postgres。代码中有相当多的原始 SQL 文字使用 ? 作为占位符,例如 SELECT id FROM users WHERE
似乎在绑定(bind)某些数据时出错了,有人可以帮我解决我哪里出错了,尽管我无法弄清楚。 真的不需要在这里显示太多,这是 Binding,我已经通过移除背景并在其中放置颜色来测试背景,效果很好。 编辑
我正在尝试使用 wcf 构建一个 http 监听器(web 服务)。这个监听器是一个更大的桌面应用程序的一部分。此桌面应用程序还会调用 http 监听器。 当监听器接收到数据时,它应该被传递到桌面应用
嘿嘿。 我正在使用 Node.JS 和 child_process 来生成 bash 进程。我试图了解我是否正在执行 I/O 绑定(bind)、CPU 绑定(bind)或两者兼而有之。 我正在使用 p
尝试执行以下操作并出现“Got interpolation ({{}}) where expression was expected”错误。 {{item.name}} 谢谢!
我有一个导入的 Java 库,它是我解决方案中的“绑定(bind)库”项目。 我正在尝试从解决方案中的另一个项目绑定(bind)到第 3 方库中的服务。 第 3 方库文档 [在 java 中] 非常简
我是一名优秀的程序员,十分优秀!