WPFBinding转换与校验
WPF教程

基本数据绑定概念
不论要绑定什么元素,不论数据源的特性是什么,每个绑定都始终遵循下图所示的 模型:
如图所示,数据绑定实质上是绑定目标与绑定源之间的桥梁。该图演示以下基本的 WPF 数据绑定概念:
通常,每个绑定都具有四个组件:绑定目标对象、目标属性、绑定源,以及要使用 的绑定源中的值的路径。例如,如果要将 TextBox 的内容绑定到 Employee 对象的 Name 属性,则目标对象是 TextBox,目标属性是 Text 属性,要使用的值是 Name, 源对象是 Employee 对象。 目标属性必须为依赖项属性。大多数 UIElement 属性都是依赖项属性,而大多数依 赖项属性(除了只读属性)默认情况下都支持数据绑定。(只有 DependencyObject 类型可以定义依赖项属性,所有 UIElement 都派生自 DependencyObject。)
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";
触发目标属性更新的原因
若要检测源更改(适用于 OneWay 和 TwoWay 绑定),则源必须实现一种合适的属性更改 通知机制(如 INotifyPropertyChanged)。 INotifyPropertyChanged 接口是 WPF/Silverlight 开发中非常重要的接口, 它构成了 ViewModel 的基础, 数据绑定基本上都需要这个接口。 所以, 对它的实现也显得非常重 要。
wpf binding 参数

wpf binding 参数
WPF绑定参数指的是在绑定表达式中使用的可选参数和标志。
以下是几个常见的参数和标志:
1. Mode:指定绑定的模式,例如OneWay(默认值,只能从
源到目标进行绑定)或TwoWay(可以在源和目标之间进行双向绑定)。
2. UpdateSourceTrigger:指定何时更新源值。
默认情况下,绑
定在目标属性更改时更新源值。
3. Converter:指定一个转换器对象,用于在源值和目标值之间进行转换。
转换器必须实现IValueConverter接口。
4. ConverterParameter:指定转换器的额外参数。
5. ValidatesOnDataErrors:设置为True以启用数据验证。
在数
据验证期间,将使用IDataErrorInfo接口或特定的数据验证规
则对源值进行验证。
6. ValidatesOnExceptions:设置为True以启用异常验证。
如果
源值引发异常,则会将其视为验证错误。
7. NotifyOnSourceUpdated和NotifyOnTargetUpdated:指定在
源或目标属性更新时是否引发事件。
这些是通过绑定提供的一些常见参数和标志,通过使用它们,可以更灵活地控制WPF绑定的行为。
深入浅出WPF之Binding--笔记(2015.03.08)

深入浅出WPF之Binding--笔记(2015.03.08)C#代码:RelativeSource rs = new RelativeSource();rs.AncestorLevel = 2;rs.AncestorType = typeof(DockPanel);Binding binding = new Binding(“Name”) { RelativeSource = rs };this.textBox1.SetBinding(TextBox.TextProperty, binding);或在XAML中设置:Text=“{Binding RelativeSource={RelativeSource AncestorType={x:Type DockPanel}, AncestorLevel=2}, Path=Name}”如果TextBox需要关联自身的Name属性,代码是:RelativeSource rs = new RelativeSource();rs.Mode = RelativeSourceMode.Self;Binding binding = new Binding(“Name”) { RelativeSource = rs };this.textBox1.SetBinding(TextBox.TextProperty, binding);RelativeSource类的Mode属性的类型是RelativeSourceMode枚举,它的取值有:PreviousData、Self、TemplatedParent和FindAncestor。
RelativeSource类还有3个静态属性:PreviousData、Self、TemplatedParent,它们的类型是RelativeSource类。
实际上这3个静态属性就是创建一个RelativeSource实例、把实例的Mode属性设置为相应的值,然后返回这个实例。
《深入浅出WPF》笔记——绑定篇(二)

一、Binding对数据的校验与转化在上一篇中有提到过绑定像是一座桥梁,在桥梁两端要有源和目标以及在桥梁上面我们可以设立关卡对数据进行验证,除此之外,源提供的数据有时不一定是目标想要的类型,但是可以通过转化成为目标需要的类型。
1.1Binding的数据验证在软件设计过程中,数据的验证是经常要实现的。
要实现Binding的数据验证,主要通过Binding的ValidationRoles属性来实现。
下面让我们认识一下ValidationRoles(验证条件):可以看到ValidationRoles是复数形式,应该可以想到他是一个Collection<ValidationRole>类型的的属性,而ValidationRole是一个抽象类,所以我们要向验证条件集合里面添加的应该是继承自ValidationRole的一个实例,既然要继承抽象类,那么就要实现Validate方法,其形式为public abstract ValidationResult Validate(object value, CultureInfo cultureInfo),其中Value是要验证的值,cultureInfo暂不用理会,方法的返回值为ValidationResult类型的,Validate具有两个形参(一个是否通过验证,一个是错误信息)。
为什么验证条件要用集合类型的呢?这是因为在一个绑定中可以有一个源,每一个源可以有很多属性,而且一个绑定可以对应多个目标。
所以就可能有多个验证(由于上面文字涉及的变量比较多,建议在VS上面转到定义上,好好理解一下)。
我们暂且还拿TextBox文本框与Slider控件的相互绑定为例吧!现在的需求是想让用户在滑动Slider和填写TextBox时,验证滑动范围和填写数字范围在0-100之间,如果不是在这个范围里,就提示输入数字不合理,且文本框的边框显示红色。
A、实现Validate方法代码RangeValidationRule.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Controls;namespace CommonLib{public class RangeValidationRule : ValidationRule{public override ValidationResult Validate(object value,System.Globalization.CultureInfo cultureInfo){double d = 0;if (double.TryParse(value.ToString(), out d)){if (d >= 0 && d <= 80){return new ValidationResult(true, null);}}return new ValidationResult(false,"输入数字不合理!!");}}B、XAML代码View CodeC、cs代码CS效果图如图1:图1本段代码重在理解Binding的数据校验,还有很多细节要进行优化。
wpf中binding的原理

wpf中binding的原理
在WPF中,Binding是一种将数据源和目标联系起来的机制。
它可以将逻辑层对象和UI层的控件对象相关联,实现数据的双向绑定。
Binding的工作原理可以概括为以下步骤:
1.建立连接:Binding通过通道建立数据源和目标之间的连接,使得数
据可以在两者之间传输。
2.数据传输:一旦建立连接,数据就可以在数据源和目标之间进行传
输。
根据需要,Binding可以支持双向传输或单向传输。
3.数据验证与转换:Binding可以在通道上建立相应的验证等关卡来验
证数据的有效性,或者进行其他处理工作。
同时,它也支持对数据的传输方向进行控制。
4.更新通知:当数据源对象实现INotifyPropertyChanged接口并引发
PropertyChanged事件时,Binding机制就会将这个事件通知给相应的目标对象,触发目标的更新。
这样,当数据源对象的数据发生变化时,UI层可以及时、准确地得到更新。
总之,Binding机制通过建立连接、数据传输、验证与转换以及更新通知等步骤,实现了在WPF中将数据源和目标相关联的目标,使得数据可以在UI层得到准确的展现,并且能够响应用户的操作,实现了数据驱动UI的过程。
wpf ui的binding用法

wpf ui的binding用法在WPF(Windows Presentation Foundation)中,数据绑定(Binding)是一项强大的功能,允许你将用户界面(UI)元素与数据模型绑定在一起,实现数据的自动同步。
以下是WPF 中数据绑定的一般用法:1. 基本绑定:```xaml<TextBlock Text="{Binding Path=PropertyName}" />```在这个例子中,`TextBlock`的`Text`属性与数据模型中的`PropertyName`属性绑定。
2. 双向绑定:```xaml<TextBox Text="{Binding Path=PropertyName, Mode=TwoWay}" />```这样的绑定不仅会更新UI显示,也会在用户修改时更新数据模型。
3. 源更新触发器:```xaml<TextBox Text="{Binding Path=PropertyName, UpdateSourceTrigger=PropertyChanged}" /> ````UpdateSourceTrigger`属性定义了何时更新源(数据模型),`PropertyChanged`表示在每次属性变化时即时更新。
4. 数据转换器:```xaml<TextBlock Text="{Binding Path=PropertyName, Converter={StaticResource MyConverter}}" /> ```使用转换器(Converter)可以在UI元素和数据模型之间进行值的转换。
5. 多层次绑定:```xaml<TextBlock Text="{Binding Path=ParentObject.ChildObject.PropertyName}" />```支持多层次的数据绑定。
wpf binding 运算

wpf binding 运算WPF(Windows Presentation Foundation)是微软的一种用户界面框架,用于创建跨平台的桌面应用程序。
其核心概念之一就是数据绑定,它允许开发者将应用程序的前端界面与后端数据之间建立起一个强大的连接。
数据绑定使开发者能够实现将数据实时反映到UI上,从而提供更好的用户体验。
在WPF中,我们可以使用数据绑定来将UI元素(例如文本框、标签等)的属性与数据源之间建立关系,使数据源的改变能够自动反映到UI上。
其中,WPF 提供了一系列的Binding类用于实现不同类型的数据绑定。
而在某些场景下,我们可能需要进行一些额外的数据运算,以便将数据在UI上呈现出更丰富的信息。
这时,我们可以利用WPF的Binding机制进行运算,从而实现更高级的数据绑定。
本文将以中括号([])为主题,分为以下几个部分,逐步解答关于WPF Binding 运算的问题。
第一部分:WPF数据绑定基础在深入探讨Binding运算前,我们首先需要了解WPF数据绑定的基础知识。
这包括如何建立数据绑定关系、如何定义数据源、如何设置Binding的属性等等。
我们将逐步介绍这些概念,并演示如何在WPF应用程序中实现简单的数据绑定。
第二部分:BindingPath和BindingModeBindingPath用于指定数据源中的属性路径,而BindingMode决定了数据绑定的方向和行为。
我们将详细介绍这两个属性的使用方法,并以具体的示例代码进行说明。
第三部分:Binding转换器(ValueConverter)在某些情况下,我们可能需要对绑定的数据进行转换,以便将其在UI上呈现为更符合预期的形式。
这时,我们可以使用Binding转换器(ValueConverter)来实现数据的转换操作。
我们将讲解如何创建和使用ValueConverter,并展示它在Binding运算中的应用。
第四部分:Binding表达式(MultiBinding和PriorityBinding)Binding表达式允许我们在Binding过程中使用多个绑定源,并将多个源的值进行运算或组合。
wpf bindingexpression用法 -回复

wpf bindingexpression用法-回复WPF BindingExpression用法在WPF中,数据绑定是一种强大且重要的机制,它允许开发人员将数据从源对象(如Model或ViewModel)绑定到目标元素(如UI控件),实现数据的同步更新和展示。
WPF的数据绑定采用了BindingExpression这个类来处理具体的绑定操作。
BindingExpression定义了绑定表达式的属性和方法,使开发人员能够对数据绑定进行更精细的控制和处理。
在本文中,我们将逐步介绍和回答关于WPF BindingExpression的用法和相关问题。
第一步:了解BindingExpression的概念和作用BindingExpression是一种表示数据绑定的表达式,在WPF中它是通过Binding类和DependencyObject类之间的关系创建的。
它的作用是在目标元素和源对象之间建立通信和同步,使数据更新可以自动反映在UI 控件上。
第二步:创建BindingExpression对象BindingExpression对象通常是通过Binding类的静态方法Expression.CreateBindingExpression()来创建的。
这个方法接受两个参数:目标元素和源对象,然后返回一个表示绑定的BindingExpression对象。
例如,在XAML中可以这样创建一个BindingExpression对象:<TextBox Text="{Binding Path=SomeProperty}"/>第三步:通过BindingExpression获取或设置绑定的属性一旦我们有了BindingExpression对象,就可以使用它来获取或设置绑定到目标元素的属性。
BindingExpression提供了各种方法和属性供开发人员使用。
例如,要获取绑定的值,可以使用GetValue()方法:object value = bindingExpression.GetValue();要设置绑定的值,可以使用SetValue()方法:bindingExpression.SetValue(value);第四步:监视绑定的状态和做出相应的处理BindingExpression对象还可以通过一些属性和事件来监视绑定的状态,并在需要时采取相应的措施。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WPF Binding转换与校验Binding是WPF的核心,而数据的转换与校验是与Binding配套的,其重要性不言而喻,前面介绍了WPF的Binding,现在来看下Converter&Validation。
本文目标是以简单的Demo展示Converter&Validation的用法。
Binding用于数据有效性校验的是Binding的ValidationRules属性,用于数据类型转换的是Binding的Converter属性。
当Source端Path所关联的数据与Target目标属性数据类型不一致是,我们可以添加数据转换器。
给出一个Demo。
首先在xaml界面中定义一个Grid。
<Grid><TextBlock x:Name="txtMsg" Text="{Binding ElementName=txtBox, Path=(Validation.Errors)[0].ErrorContent}" Foreground="Red" FontWeight="Bold" Margin="34,12,161,280" /><DataGrid AutoGenerateColumns="False" Margin="34,48,44,21" Name="dataGrid1" DataContext="{Binding}"><DataGrid.Columns><DataGridTemplateColumn Header="Id" Width="*" IsReadOnly="True"><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock FontSize="16" Text="{Binding Id}" Background="{Binding Id,Converter={StaticResourceIdConverter1}}"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Header="Name" Width="2*" IsReadOnly="True"><DataGridTemplateColumn.CellTemplate><DataTemplate><!--<TextBlock Text="{Binding Name}"/>--> <TextBlock x:Name="txtBox"Validation.ErrorTemplate="{StaticResource errorTemplate}"Validation.Error="txtBox_Error" ><TextBlock.Text><Binding Path="Name" NotifyOnValidationError="True" ><Binding.ValidationRules><local:NameValidationRule ValidatesOnTargetUpdated="True" /></Binding.ValidationRules></Binding></TextBlock.Text></TextBlock></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Header="Age" Width="*" IsReadOnly="True"><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock Text="{Binding Age}"/> </DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid></Grid>下面自定义一个DataTable对象,作为Grid的数据源。
using System.Data;namespace ConverterAndValidation{public class ClassData{///<summary>///手动创建一个DataTable///</summary>///<returns></returns>public static DataTable GetDataTable(){DataTable dt = new DataTable();dt.Columns.Add("Id");dt.Columns.Add("Name");dt.Columns.Add("Age");//for (int i = 1; i <= 10; i++){DataRow dr = dt.NewRow();dr.ItemArray = new object[] { i, "DebugLZQ"+i, 25+i }; dt.Rows.Add(dr);}return dt;}}}Binding如下:DataTable dt = ClassData.GetDataTable(); dataGrid1.ItemsSource = dt.DefaultView; 为了进行转换需要实现IValueConverter接口。
using System;using System.Windows.Data;using System.Windows.Media;namespace ConverterAndValidation{class IdConverter:IValueConverter{#region IValueConverter 成员public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){int id = int.Parse(value.ToString());if (id == 1)return new SolidColorBrush(Colors.Silver );if (id == 2)return new SolidColorBrush(Colors.Teal );elsereturn new SolidColorBrush(Colors.Gold );}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){throw new NotImplementedException();}#endregion}}如何消费这个IdConverter呢?添加一个xmlnsxmlns:local="clr-namespace:ConverterAndValidation"添加Window.Resources资源<local:IdConverter x:Key="IdConverter1"/>在Binding处<TextBlock FontSize="16" Text="{Binding Id}" Background="{Binding Id,Converter={StaticResource IdConverter1}}"/>下面同样以这个例子,写数据校验的Demo。
为了进行校验,需要准备一个抽象类ValidationRule的派生类。
using System.Windows.Controls;namespace ConverterAndValidation{class NameValidationRule:ValidationRule{public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo){string name = value.ToString();if (name!= "DebugLZQ5"){return new ValidationResult(true, null);}return new ValidationResult(false, "Error Name,Validation Failed.");}}}如何消费这个Validation?在Window.Resources中添加<local:NameValidationRule x:Key="NameValidationRule1"/><ControlTemplate x:Key="errorTemplate"><!--<StackPanel><TextBlock Foreground="Red">InvalidValue!!!</TextBlock><AdornedElementPlaceholder/></StackPanel>--><DockPanel><TextBlock Foreground="Red">InvalidValue!!!</TextBlock><AdornedElementPlaceholder/></DockPanel></ControlTemplate>Binding部分<TextBlock x:Name="txtBox" Validation.ErrorTemplate="{StaticResource errorTemplate}" Validation.Error="txtBox_Error" ><TextBlock.Text><Binding Path="Name" NotifyOnValidationError="True" ><Binding.ValidationRules><local:NameValidationRuleValidatesOnTargetUpdated="True" /></Binding.ValidationRules></Binding></TextBlock.Text></TextBlock>txtBox_Error如下private void txtBox_Error(object sender,ValidationErrorEventArgs e){if (e.Action == ValidationErrorEventAction.Added) //Validation Error Occurred{txtMsg.Text = e.Error.ErrorContent.ToString(); }else// No Error{txtMsg.Text = "";}}程序的运行结果如下:附:程序完整的xaml如下:<Window x:Class="ConverterAndValidation.MainWindow"xmlns="/winfx/2006/xaml/presentation" xmlns:x="/winfx/2006/xaml"xmlns:local="clr-namespace:ConverterAndValidation"Title="MainWindow" Height="350" Width="525"><Window.Resources><local:IdConverter x:Key="IdConverter1"/><local:NameValidationRule x:Key="NameValidationRule1"/><ControlTemplate x:Key="errorTemplate"><!--<StackPanel><TextBlock Foreground="Red">InvalidValue!!!</TextBlock><AdornedElementPlaceholder/></StackPanel>--><DockPanel><TextBlock Foreground="Red">InvalidValue!!!</TextBlock><AdornedElementPlaceholder/></DockPanel></ControlTemplate></Window.Resources><Grid><TextBlock x:Name="txtMsg" Text="{Binding ElementName=txtBox, Path=(Validation.Errors)[0].ErrorContent}" Foreground="Red" FontWeight="Bold" Margin="34,12,161,280" /><DataGrid AutoGenerateColumns="False" Margin="34,48,44,21" Name="dataGrid1" DataContext="{Binding}"><DataGrid.Columns><DataGridTemplateColumn Header="Id" Width="*" IsReadOnly="True"><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock FontSize="16" Text="{Binding Id}" Background="{Binding Id,Converter={StaticResourceIdConverter1}}"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Header="Name" Width="2*" IsReadOnly="True"><DataGridTemplateColumn.CellTemplate><DataTemplate><!--<TextBlock Text="{Binding Name}"/>--> <TextBlock x:Name="txtBox"Validation.ErrorTemplate="{StaticResource errorTemplate}"Validation.Error="txtBox_Error" ><TextBlock.Text><Binding Path="Name" NotifyOnValidationError="True" ><Binding.ValidationRules><local:NameValidationRule ValidatesOnTargetUpdated="True" /></Binding.ValidationRules></Binding></TextBlock.Text></TextBlock></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Header="Age" Width="*" IsReadOnly="True"><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock Text="{Binding Age}"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid> </Grid></Window>。