如何理解WPF中的wpf 依赖项属性性

WPF中的依赖项属性 - CSDN博客
WPF中的依赖项属性
Text=&{Binding Path=StudentAge}&
Grid.Row=&3&
Grid.Column=&2&
VerticalAlignment=&Top& Margin=&0,5,0,0& /&
int _studentA
public int StudentAge
return _studentA
_studentAge =
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyC
#endregion
void OnPropertyChanged(string propertyName)
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
int _studentA
public int StudentAge
return _studentA
_studentAge =
OnPropertyChanged(&StudentAge&);
//这句代码很重要,用其通知前台界面//去改变
public static readonly DependencyProperty StudentAgeProperty = DependencyProperty.Register(&StudentAge&,
typeof (int),
typeof (StudentData));
public int StudentAge
get { return (int)GetValue(StudentAgeProperty); }
set { SetValue(StudentAgeProperty, value); }
本文已收录于以下专栏:
相关文章推荐
在上一文中,我们用传统面向对象的方法来定义了一个类,而我们同时把该类的实例绑定到两个文本框,第一个文本框用于输入值,第二个文本框用于根据第一个文本框中的输入来取得属性值。
本系列文章是从“@东邪独孤”博客中转过来的,本想着直接拿链接过来,但是如果他删了博客就没有了,文章写得很棒,一下就理解了依赖项属性。
原文地址:http://blog.csdn.net/tcjiaa...
本系列文章是从“@东邪独孤”博客中转过来的,本想着直接拿链接过来,但是如果他删了博客就没有了,文章写得很棒,一下就理解了依赖项属性。
原文地址:http://blog.csdn.net/tcjiaa...
本系列文章是从我的QQ空间拷过来的。
依赖项属性可以称得上是WPF中比较难理解的概念,为了搞清楚这个概念,我都把.NET类库进行了反编译,但是,其结果我也是想到了的,微软不是傻子,.NET...
本系列文章,是从我的QQ空间转过来的。
上一文中,我们分析了依赖项属性的注册和定义方法,并解释了依赖项属性的注册过程,但是,有一个疑问会困惑着我们,既然依赖项属被声明为静态只读字段,那为什么它...
依赖项属性是标准.NET属性的全新实现——具有大量新增价值。在WPF的核心特性中需要嵌入依赖性属性。WPF元素提供的大多数属性都是依赖项属性。相对于创建依赖项属性,大多数情况下只是使用他们。当我们自定...
“依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值”,这是官方的一句话,理解起来有点费劲。属性本身其实很简单,就是用来封装了字段的,本质上是两个访问器,来达到对字段值的读与写,以及从业务角...
这主要是主对依赖属性的理解,大家还是多看看msdn上面说的吧
/zh-cn/library/ms752914(v=vs.100).aspx
他的最新文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
继续聊WPF——依赖项属性(2)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口WPF依赖属性_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
WPF依赖属性
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩52页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢WPF的数据绑定详细介绍
字体:[ ] 类型:转载 时间:
数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程。 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改。 数据绑定可能还意味着如果视觉元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改。
一、WPF数据绑定的概要
数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程。 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改。 数据绑定可能还意味着如果视觉元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改。
例如:如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改。
1. 数据绑定涉及到两个方面:
一个是绑定源,一个是绑定目标。绑定源即控件绑定所使用的源数据,绑定目标即数据显示的控件。
2. 对于绑定源,在WPF可以是以下四种:
•CLR对象:可以绑定到CLR类的公开的属性、子属性、索引器上。 •ADO.Net对象:例如DataTable、DataView等 。•XML文件:使用XPath进行解析 。•DependencyObject:绑定到其依赖项属性上,即控件绑定控件 。对于绑定目标,必须是WPF中的DependencyObject,将数据绑定到其依赖项属性上。
二、&&&&& 绑定的模式
1.& 根据数据流的方向,WPF中的数据绑定分为以下四种:
OneWay 绑定:对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。此绑定类型适用于绑定的控件为隐式只读控件的情况。
TwoWay 绑定:对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案 。
OneWayToSource 与 OneWay 相反;它在目标属性更改时更新源属性。
OneTime绑定:该绑定会导致源属性初始化目标属性,但不传播后续更改。
注释:如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。
大多数属性都默认为 OneWay 绑定,但是一些依赖项属性,通常为用户可编辑的控件的属性,如 TextBox 的 Text 属性和 CheckBox 的 IsChecked 属性,默认为 TwoWay 绑定。
如果要知道依赖项属性绑定在默认情况下是单向还是双向的编程方法可使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。
示例代码:
代码如下:&Page x:Class="WpfDemo.Page1"
&&& xmlns="/winfx/2006/xaml/presentation"
&&& xmlns:x="/winfx/2006/xaml"
&&& Title="Page1" HorizontalAlignment="Center"&
&&&&&&& &Grid Name="GridTable" Height="360" Background="Silver"&
&&&&&&&&&&& &Grid.RowDefinitions&
&&&&&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&&&&&& &/Grid.RowDefinitions&
&&&&&&&&&&& &Grid.ColumnDefinitions&
&&&&&&&&&&& &ColumnDefinition Width="130"&&/ColumnDefinition&
&&&&&&&&&&& &ColumnDefinition Width="150"&&/ColumnDefinition&
&&&&&&&&&&& &ColumnDefinition Width="20"&&/ColumnDefinition&
&&&&&&&&&&& &/Grid.ColumnDefinitions&
&&&&&&& &Label Width="130" Height="25"& Grid.Row="0" Grid.Column="0"& Name="label1"&TwoWay&/Label&
&&&&&&& &TextBox Width="150" Height="25"& Grid.Row="0" Grid.Column="1"& Name="textBox4" Text="{Binding ElementName=scrollBar1,Path=Value,Mode=TwoWay}" /&
&&&&&&& &Label Width="130" Height="25"& Grid.Row="1" Grid.Column="0"& Name="label2"&OneWay&/Label&
&&&&&&& &TextBox Width="150" Height="25"& Grid.Row="1" Grid.Column="1"&& Name="textBox1" Text="{Binding ElementName=scrollBar1, Path=Value,Mode=OneWay}"/&
&&&&&&& &Label Width="130" Height="25"& Grid.Row="2" Grid.Column="0"& Name="label3"&OneWayToSource&/Label&
&&&&&&& &TextBox Width="150" Height="25"& Grid.Row="2" Grid.Column="1"&& Name="textBox2" Text="{Binding ElementName=scrollBar1, Path=Value,Mode=OneWayToSource}" /&
&&&&&&& &Label Width="130" Height="25"& Grid.Row="3" Grid.Column="0"& Name="label4"&OneTime&/Label&
&&&&&&& &TextBox Width="150" Height="25"& Grid.Row="3" Grid.Column="1"&& Name="textBox3" Text="{Binding ElementName=scrollBar1, Path=Value,Mode=OneTime}"/&
&&&&&&&& &ScrollBar Value="30" Minimum="0" Grid.RowSpan="4" Grid.Row="0" Grid.Column="2" Maximum="100" Name="scrollBar1" Width="18" Height="{Binding ElementName=GridTable,Path=Height}" /&
&&&&&&& &/Grid&
&/Page&根据程序执行结果,我们可以得到以下结论:
对于OneWay绑定:在界面中显示的数据可以随数据源的值的变化而变化,但更改界面的数据不会影响到数据源。
对于TwoWay绑定:界面中显示的数据及数据源的数据可以双向显示及更新。
对于OneWayToSource绑定:初始时界面的数据为空;更改界面的数据可以影响数据源的值,但是更改数据源的值不会体现在界面上。
对于OneTime绑定:在界面中显示的为数据源的初始值,更改数据源的值的时候,不会更改界面的数据显示;更改界面的数据也不会影响到数据源的数据。
三、绑定目标值影响绑定源值条件
问题:绑定源的值是在您编辑文本的同时进行更新,还是在您结束编辑文本并将鼠标指针从文本框移走后才进行更新呢?或者在您需要更新的情况下在手动的更新呢?
1. UpdateSourceTrigger 属性是确定触发源更新的原因。
下图中右箭头的点演示 UpdateSourceTrigger 属性的角色:
TwoWay及OneWayToSource是由绑定目标到绑定源方向,若实现绑定目标的值更改影响绑定源的值方式,只需要设置相应控件绑定时的UpdateSourceTrigger的值,其值有三种:
PropertyChanged:当绑定目标属性更改时,立即更新绑定源。
LostFocus:当绑定目标元素失去焦点时,更新绑定源。
Explicit:仅在调用 UpdateSource 方法时更新绑定源。
注释:多数依赖项属性的UpdateSourceTrigger 值的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。
代码如下:XAML:
&Page x:Class="WpfDemo.Changed"
&&& xmlns="/winfx/2006/xaml/presentation"
&&& xmlns:x="/winfx/2006/xaml"
&&& Title="Changed"&
&&& &Grid Name="GridTable" Height="250" Background="Silver" Width="350"&
&&&&&&& &Grid.RowDefinitions&
&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&& &/Grid.RowDefinitions&
&&&&&&& &Grid.ColumnDefinitions&
&&&&&&&&&&& &ColumnDefinition Width="100"&&/ColumnDefinition&
&&&&&&&&&&& &ColumnDefinition Width="150"&&/ColumnDefinition&
&&&&&&&&&&& &ColumnDefinition Width="100"&&/ColumnDefinition&
&&&&&&& &/Grid.ColumnDefinitions&
&&&&&&& &TextBlock Grid.Row="0" Width="90" Height="25" Grid.Column="0" Name="label1" Text="PropertyChanged:"&&/TextBlock&
&&&&&&& &TextBlock Grid.Row="1"& Width="90" Height="25" Grid.Column="0" Name="label2" Text="LostFocus:"&&/TextBlock&
&&&&&&& &TextBlock Grid.Row="2"& Width="90" Height="25" Grid.Column="0" Name="label3" Text="Explicit:"&&/TextBlock&
&&&&&&& &TextBox Grid.Row="0" Width="150" Height="25" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"& Grid.Column="1" Name="TextBox1" /&
&&&&&&& &TextBox Grid.Row="1" Width="150" Height="25" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=LostFocus}"&& Grid.Column="1"& Name="TextBox2" /&
&&&&&&& &TextBox Grid.Row="2" Width="150" Height="25" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=Explicit}"&& Grid.Column="1"& Name="txtExplicit" /&
&&&&&&& &TextBlock Grid.Row="3" Width="90" Height="25"& Grid.Column="0" Name="lblResult" Text="结果:"&&/TextBlock&
&&&&&&& &TextBlock Grid.Row="3" Width="90" Height="25"& Grid.Column="1" Name="lblDisplay" Text="{Binding Path=UserName,Mode=OneWay}"&&/TextBlock&
&&&&&&& &Button Name="btnChanged" Width="90" Height="25" Grid.Row="3" Grid.Column="2"&Explicit&/Button&
&&& &/Grid&
&/Page& 代码如下:C#:
namespace WpfDemo
&&& public partial class Changed : Page
&&&&&&& #region properties
&&&&&&& public UserModel CurrentUser
&&&&&&&&&&&
&&&&&&& #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.CurrentU
&&&&&&& #endregion
&&&&&&& #region btnLogon_Click
&&&&&&& void btnChanged_Click(object sender, RoutedEventArgs e)
&&&&&&&&& this.txtExplicit.GetBindingExpression(TextBox.TextProperty).UpdateSource();
&&&&&&& #endregion
&&& public class UserModel
&&&&&&& public string UserName
&&&&&&&&&&&}
程序执行结果如上所述。
四、&&&&& 数据提供程序
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="/winfx/2006/xaml/presentation"
&&& xmlns:x="/winfx/2006/xaml"
&&& Title="xmlBinding" xmlns:local="clr-namespace:WpfDemo"&
&&& &Page.Resources&
&&&&&&& &XmlDataProvider x:Key="XmlFile" Source="Students.xml" XPath="/Students"&&/XmlDataProvider&
&&&&&&& &XmlDataProvider x:Key="InnerXmlStu" XPath="/Students"&
&&&&&&&&&&& &x:XData&
&&&&&&&&&&&&&&& &Students xmlns=""&
&&&&&&&&&&&&&&&&&&& &Student&&name&swd&/name&&/Student&
&&&&&&&&&&&&&&&&&&& &Student&&name&awd&/name&&/Student&
&&&&&&&&&&&&&&&&&&& &Student&&name&asd&/name&&/Student&
&&&&&&&&&&&&&&& &/Students&
&&&&&&&&&&& &/x:XData&
&&&&&&& &/XmlDataProvider&
&&& &/Page.Resources&
&&& &Grid&
&&&&&&& &Grid.RowDefinitions&
&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&&&&&& &RowDefinition&&/RowDefinition&
&&&&&&& &/Grid.RowDefinitions&
&&&&&&& &Grid.ColumnDefinitions&
&&&&&&&&&&& &ColumnDefinition Width="100"&&/ColumnDefinition&
&&&&&&&&&&& &ColumnDefinition Width="150"&&/ColumnDefinition&
&&&&&&& &/Grid.ColumnDefinitions&
&&&&&&& &TextBlock Grid.Row="0" Grid.Column="0"& Height="25" Width="100"& Text="引用XML文件"&&/TextBlock&
&&&&&&& &TextBlock Grid.Row="1" Grid.Column="0" Height="25" Width="100"&& Text="内嵌XML"&&/TextBlock&
&&&&&&& &TextBlock Grid.Row="2" Grid.Column="0"& Height="25" Width="100"& Text="动态XML"&&/TextBlock&
&&&&&&& &ListBox Name="lisbXmlFile" Grid.Row="0" Grid.Column="1" Height="100" Width="150" ItemsSource="{Binding Source={StaticResource XmlFile},XPath=Student/name}"&
&&&&&&& &/ListBox&
&&&&&&& &ListBox Name="lisbInnerXml" Grid.Row="1" Grid.Column="1"& Height="100" Width="150" ItemsSource="{Binding Source={StaticResource InnerXmlStu},XPath=Student/name}"&
&&&&&&& &/ListBox&
&&&&&&& &ListBox Name="lisbXmlDoc" Grid.Row="2" Grid.Column="1"& Height="100"& Width="150" ItemsSource="{Binding XPath=Student/name}"&
&&&&&&& &/ListBox&
&&& &/Grid&
&/Page& 代码如下: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:
namespace WpfDemo
&&& #region CObjectDataProvider
&&& public partial class CObjectDataProvider : Page
&&&&&&& public CObjectDataProvider()
&&&&&&& {InitializeComponent();}
&&& #endregion
&&& #region Country
&&& public class Country
&&&&&&& #region Name
&&&&&&& public string Name
&&&&&&& {}
&&&&&&& #endregion
&&&&&&& #region ProvinceList
&&&&&&& public List&Province& ProvinceList
&&&&&&& {}
&&&&&&& #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
&&&&&&& {}
&&&&&&& #endregion
&&&&&&& #region CityList
&&&&&&& public List&City& CityList
&&&&&&& {}
&&&&&&& #endregion
&&& #endregion
&&& #region City
&&& public class City
&&&&&&& #region Name
&&&&&&& public string Name
&&&&&&& {}
&&&&&&& #endregion
#endregion
五、类型转换与数据校验
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="/winfx/2006/xaml/presentation"
&&& xmlns:x="/winfx/2006/xaml"
&&& Title="TypeConvertAndValidationRule"
&&&&& xmlns:src="clr-namespace:WpfDemo"&
&&& &Grid Height="250" Width="360" Background="Silver"&
&&&&&&& &Grid.RowDefinitions&&&& &RowDefinition&&&& &/RowDefinition&&&& &RowDefinition&&&& &/RowDefinition&&&& &RowDefinition&&&& &/RowDefinition&&&&&&& &/Grid.RowDefinitions&
&&&&&&& &Grid.ColumnDefinitions&&&&&&&&&&&&&&& &ColumnDefinition&&&& &/ColumnDefinition&&&& &ColumnDefinition&&&& &/ColumnDefinition&&&&&&&& &/Grid.ColumnDefinitions&
&&&&&&& &TextBlock Height="25" Width="100" Text="生日"& Grid.Row="0" Grid.Column="0"&&/TextBlock&
&&&&&&& &TextBox Name="txtBirthday" Height="25" Width="150"& Grid.Row="0" Grid.Column="1"&
&&&&&&&&&&& &TextBox.Text&
&&&&&&&&&&&&&&& &Binding Path="Birthday" UpdateSourceTrigger="LostFocus" Mode="TwoWay"&
&&&&&&&&&&&&&&&&&& &Binding.ValidationRules&&src:ValidationDateTimeRule/&&/Binding.ValidationRules&
&&&&&&&&&&&&&&&&&& &Binding.Converter&&src:MyConverterOfBirthFormat/&&/Binding.Converter&
&&&&&&&&&&&&&&& &/Binding&&&&&&&&&&& &/TextBox.Text&
&&&&&&&&&& &TextBox.ToolTip&&&&&&&&&&&&&&&& &Binding RelativeSource="{RelativeSource Self}" Path="(Validation.Errors)&&&&&&& [0].ErrorContent"&&/Binding&&&&&&&&&&& &/TextBox.ToolTip&&&&&&& &/TextBox&
&&&&&&& &TextBlock Height="25" Width="150" Grid.Row="1" Text="{Binding Path=Birthday,Mode=OneWay}" Grid.Column="1"&&/TextBlock&
&&&&&&& &TextBlock Height="25" Width="100" Text="电子邮件格式检查" Grid.Row="2" Grid.Column="0"&&/TextBlock&
&&&&&&& &TextBox Height="25" Width="150" Grid.Row="2" Grid.Column="1"&
&&&&&&&&&&& &TextBox.Text&
&&&&&&&&&&&&&&& &Binding Path="EMail"&
&&&&&&&&&&&&&&&&&&& &Binding.ValidationRules&&ExceptionValidationRule /&&/Binding.ValidationRules&
&&&&&&&&&&&&&&& &/Binding&&&&&&&&&&&& &/TextBox.Text&
&&&&&&&&&&& &TextBox.ToolTip&
&&&&&&&&&&&&&&&&&& &Binding RelativeSource="{RelativeSource Self}" Path="(Validation.Errors)[0].ErrorContent"&&/Binding&
&&&&&&&&&&& &/TextBox.ToolTip&&&&&&& &/TextBox&
&&& &/Grid&
&/Page& 代码如下:C#:
namespace WpfDemo
&&& #region TypeConvertAndValidationRule
&&& public partial class TypeConvertAndValidationRule : Page
&&&&&&& public TypeConvertAndValidationRule()
&&&&&&&&&&& InitializeComponent();
&&&&&&&&&&& this.DataContext = new UserInfo { Name = "swd", Birthday =System.Convert.ToDateTime(""), EMail = "" };
&&& #endregion
&&& #region UserInfo
&&& public class UserInfo
&&&&&&& #region Name
&&&&&&& public string Name
&&&&&&& {}
&&&&&&& #endregion
&&&&&&& #region Birthday
&&&&&&& public DateTime Birthday
&&&&&&& {}
&&&&&&& #endregion
&&&&&&& #region EMail
&&&&&&& public string EMail
&&&&&&&&&&& get
&&&&&&&&&&& {}
&&&&&&&&&&& set
&&&&&&&&&&& {
&&&&&&&&&&&&&&& this.email =
&&&&&&&&&&&&&&& Regex r = new Regex(@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");
&&&&&&&&&&&&&&& if (!r.IsMatch(value))
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& throw new ApplicationException("电子邮件格式有误!");
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&& #endregion
&&& #endregion
六、&&&&& 绑定集合对象
1.&&&&&& ICollectionView接口
允许集合具有当前记录管理、自定义排序、筛选和分组这些功能。比如排序,分组,筛选,导航以及其它自定义视图,并且这不会影响到你的后台数据的实际存储。
2.&&&&&& ObservableCollection &T& 类
表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。
3.&&&&&& WPF MVVM概要
MVVM(Model-View-ViewModel)是由MVC,MVP演变而来。MVVM分离了逻辑与界面,解放业务逻辑。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 wpf 定义依赖属性 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信