WPFBinding转换与校验.docx
《WPFBinding转换与校验.docx》由会员分享,可在线阅读,更多相关《WPFBinding转换与校验.docx(11页珍藏版)》请在冰豆网上搜索。
WPFBinding转换与校验
WPFBinding转换与校验
Binding是WPF的核心,而数据的转换与校验是与Binding配套的,其重要性不言而喻,前面介绍了WPF的Binding,现在来看下Converter&Validation。
本文目标是以简单的Demo展示Converter&Validation的用法。
Binding用于数据有效性校验的是Binding的ValidationRules属性,用于数据类型转换的是Binding的Converter属性。
当Source端Path所关联的数据与Target目标属性数据类型不一致是,我们可以添加数据转换器。
给出一个Demo。
首先在xaml界面中定义一个Grid。
Name="txtMsg"Text="{BindingElementName=txtBox,Path=(Validation.Errors)[0].ErrorContent}"Foreground="Red"FontWeight="Bold"Margin="34,12,161,280"/>
---->
Name="txtBox"Validation.ErrorTemplate="{StaticResourceerrorTemplate}"Validation.Error="txtBox_Error">
NameValidationRuleValidatesOnTargetUpdated="True"/>
下面自定义一个DataTable对象,作为Grid的数据源。
usingSystem.Data;
namespaceConverterAndValidation
{
publicclassClassData
{
///
///手动创建一个DataTable
///
///
publicstaticDataTableGetDataTable()
{
DataTabledt=newDataTable();
dt.Columns.Add("Id");
dt.Columns.Add("Name");
dt.Columns.Add("Age");
//
for(inti=1;i<=10;i++)
{
DataRowdr=dt.NewRow();
dr.ItemArray=newobject[]{i,"DebugLZQ"+i,25+i};
dt.Rows.Add(dr);
}
returndt;
}
}
}
Binding如下:
DataTabledt=ClassData.GetDataTable();
dataGrid1.ItemsSource=dt.DefaultView;
为了进行转换需要实现IValueConverter接口。
usingSystem;
usingSystem.Windows.Data;
usingSystem.Windows.Media;
namespaceConverterAndValidation
{
classIdConverter:
IValueConverter
{
#regionIValueConverter成员
publicobjectConvert(objectvalue,TypetargetType,objectparameter,System.Globalization.CultureInfoculture)
{
intid=int.Parse(value.ToString());
if(id==1)
returnnewSolidColorBrush(Colors.Silver);
if(id==2)
returnnewSolidColorBrush(Colors.Teal);
else
returnnewSolidColorBrush(Colors.Gold);
}
publicobjectConvertBack(objectvalue,TypetargetType,objectparameter,System.Globalization.CultureInfoculture)
{
thrownewNotImplementedException();
}
#endregion
}
}
如何消费这个IdConverter呢?
添加一个xmlns
xmlns:
local="clr-namespace:
ConverterAndValidation"
添加Window.Resources资源
IdConverterx:
Key="IdConverter1"/>
在Binding处
下面同样以这个例子,写数据校验的Demo。
为了进行校验,需要准备一个抽象类ValidationRule的派生类。
usingSystem.Windows.Controls;
namespaceConverterAndValidation
{
classNameValidationRule:
ValidationRule
{
publicoverrideValidationResultValidate(objectvalue,System.Globalization.CultureInfocultureInfo)
{
stringname=value.ToString();
if(name!
="DebugLZQ5")
{
returnnewValidationResult(true,null);
}
returnnewValidationResult(false,"ErrorName,ValidationFailed.");
}
}
}
如何消费这个Validation?
在Window.Resources中添加
NameValidationRulex:
Key="NameValidationRule1"/>
Key="errorTemplate">
--
InvalidValue!
!
!
-->
InvalidValue!
!
!
Binding部分
Name="txtBox"Validation.ErrorTemplate="{StaticResourceerrorTemplate}"Validation.Error="txtBox_Error">
NameValidationRuleValidatesOnTargetUpdated="True"/>
txtBox_Error如下
privatevoidtxtBox_Error(objectsender,ValidationErrorEventArgse)
{
if(e.Action==ValidationErrorEventAction.Added)//ValidationErrorOccurred
{
txtMsg.Text=e.Error.ErrorContent.ToString();
}
else//NoError
{
txtMsg.Text="";
}
}
程序的运行结果如下:
附:
程序完整的xaml如下:
Class="ConverterAndValidation.MainWindow"
xmlns="
xmlns:
x="
xmlns:
local="clr-namespace:
ConverterAndValidation"
Title="MainWindow"Height="350"Width="525">
IdConverterx:
Key="IdConverter1"/>
NameValidationRulex:
Key="NameValidationRule1"/>
Key="errorTemplate">
--
InvalidValue!
!
!
-->
InvalidValue!
!
!
Name="txtMsg"Text="{BindingElementName=txtBox,Path=(Validation.Errors)[0].ErrorContent}"Foreground="Red"FontWeight="Bold"Margin="34,12,161,280"/>
---->
Name="txtBox"Validation.ErrorTemplate="{StaticResourceerrorTemplate}"Validation.Error="txtBox_Error">
NameValidationRuleValidatesOnTargetUpdated="True"/>