苏州企业建设网站,帝国cms网站迁移,电 器建设网站目的及功能定位,办公室装修效果图片大全在WPF开发中#xff0c;Binding实现了数据在Source和Target之间的传递和流通#xff0c;就像现实生活中的一条条道路#xff0c;建立起了城镇与城镇之间的衔接#xff0c;而数据校验和类型转换#xff0c;就像高速公路之间的收费站和安检站。那在WPF开发中#xff0c;如何…在WPF开发中Binding实现了数据在Source和Target之间的传递和流通就像现实生活中的一条条道路建立起了城镇与城镇之间的衔接而数据校验和类型转换就像高速公路之间的收费站和安检站。那在WPF开发中如何实现数据的校验和类型转换呢本文以一个简单的小例子简述在WPF开发中实现数据校验和类型转换的相关知识点仅供学习分享使用如有不足之处还请指正。 在数据绑定Binding中数据校验主要通过ValidationRules属性数据转换主要通过Converter属性。 数据校验 在WPF开发中校验数据的有效性主要步骤如下 1. 实现校验规则 Binding的ValidationRules是CollectionValidationRule类型是一个校验规则列表可以支持多重校验。而ValidationRule是一个抽象类所有要实现业务规则校验就要继承ValidationRule并实现抽象方法。
ValidationRule的Validate方法返回一个ValidationResult对象如果校验通过则ValidationResult的IsValid为true否则为false。RangeValidationRule主要校验用户输入数据的范围
namespace WpfApp4.DataValidate
{public class RangeValidationRule : ValidationRule{public override ValidationResult Validate(object value, CultureInfo cultureInfo){double d 0;if(double.TryParse(value.ToString(),out d)){if(d0 d 100){return new ValidationResult(true,null);}}return new ValidationResult(false, 数据必须在0~100之间);}}
} 2. 设置规则 要想应用规则首先需要引入规则对应的命名空间xmlns:vclr-namespace:WpfApp4.DataValidate
然后设置Binding的ValidationRules规则如下所示
TextBlock Text年龄 VerticalAlignmentCenter/TextBlock
TextBox x:NametbAge Width120 Height25 Margin10 Validation.ErrortbAge_Error VerticalContentAlignmentCenterTextBox.TextBinding PathAge UpdateSourceTriggerPropertyChanged NotifyOnValidationErrorTrueBinding.ValidationRulesv:RangeValidationRule ValidatesOnTargetUpdatedTrue/v:RangeValidationRule/Binding.ValidationRules/Binding/TextBox.Text
/TextBox
TextBlock VerticalAlignmentCenter Text{Binding DataError} ForegroundRed/TextBlock 关于校验规则有以下几点需要注意
默认情况下认为Source的数据总是正确的规则校验只有当Target更新时才会生效因为Target多为用户输入如果当Source更新时也要生效则需要配置ValidatesOnTargetUpdated为true。
默认情况下校验规则返回的错误信息是不会输出到UI的如果要输出要UI需要设置NotifyOnValidationError属性为true。 3. 输出校验信息 默认情况下校验信息不会输出到UI只是显示用户控件为红色边框如果要输出校验信息除了设置NotifyOnValidationError属性外还要订阅Validation.Error事件并在事件中处理要显示的错误信息如下所示
private void tbAge_Error(object sender, ValidationErrorEventArgs e)
{this.viewModel.ValidationErrorCommand.Execute(e);
} 其中上述方法中的命令为ViewModel中定义如下所示
public class MainWindowViewModel : ObservableObject
{private int age;public int Age{get { return age; }set { SetProperty(ref age , value); }}private string dataError;public string DataError{get { return dataError; }set { SetProperty(ref dataError , value); }}private TextBox textBox;private ICommand winLoadedCommand;public ICommand WinLoadedCommand{get {if (winLoadedCommand null){winLoadedCommand new RelayCommandobject(WinLoaded);}return winLoadedCommand; }}private void WinLoaded(object sender){if (sender ! null){var win sender as MainWindow;this.textBox win.tbAge;}}private ICommand validationErrorCommand;public ICommand ValidationErrorCommand{get {if (validationErrorCommand null){validationErrorCommand new RelayCommandobject(DisplayValidationError);}return validationErrorCommand; }}private void DisplayValidationError(object obj){if (Validation.GetErrors(this.textBox).Count 0){this.DataError Validation.GetErrors(this.textBox)[0].ErrorContent.ToString();}else{this.DataError string.Empty;}}} 4. 数据校验示例演示 经过上述步骤运行程序如下所示 数据类型转换 在数据绑定时如果Source端的数据类型和Target端的数据类型不一致时就需要用到数据类型转换如true/false与显示/隐藏之间的转换等要实现数据转换需要用到Binding的Converter属性。步骤如下 1. 定义转换器 Binding的Converter属性是IValueConverter类型所以定义转换器需要实现IValueConverter接口如下所示
namespace WpfApp4.DataConverter
{public class BoolToVisilityConverter : IValueConverter{/// summary/// Source 到 Target/// /summary/// param namevalue/param/// param nametargetType/param/// param nameparameter/param/// param nameculture/param/// returns/returnspublic object Convert(object value, Type targetType, object parameter, CultureInfo culture){var flag bool.Parse(value.ToString());if(flag){return Visibility.Visible;}else{return Visibility.Collapsed;}}/// summary/// Target到Source/// /summary/// param namevalue/param/// param nametargetType/param/// param nameparameter/param/// param nameculture/param/// returns/returnspublic object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture){var visibility Visibility.Collapsed;if (Enum.TryParseVisibility(value.ToString(), out visibility)){if (visibility Visibility.Collapsed){return false;}else if(visibility Visibility.Visible){return true;}else{return false;}}return false;}}
} 注意IValueConverter接口共两个方法其中Convert方法当Source到Target时调用ConvertBack方法则是反方向调用。 2. 定义资源 转换器也是一种资源要声明资源首先引入命名空间xmlns:cclr-namespace:WpfApp4.DataConverter如下所示
Window.Resourcesc:BoolToVisilityConverter x:KeyboolToVisility/c:BoolToVisilityConverter
/Window.Resources 3. 调用类型转换 在Binding时调用资源Visibility{Binding ElementNamechk01, PathIsChecked, Converter{StaticResource boolToVisility}}。通过复选框的选择与否控制控件的显示与隐藏如下所示
StackPanel OrientationHorizontal Grid.Row0CheckBox Content显示 x:Namechk01/CheckBox
/StackPanel
StackPanel OrientationHorizontal Grid.Row1 Visibility{Binding ElementNamechk01, PathIsChecked, Converter{StaticResource boolToVisility}}TextBlock Text年龄 VerticalAlignmentCenter/TextBlockTextBox x:NametbAge Width120 Height25 Margin10 Validation.ErrortbAge_Error VerticalContentAlignmentCenterTextBox.TextBinding PathAge UpdateSourceTriggerPropertyChanged NotifyOnValidationErrorTrueBinding.ValidationRulesv:RangeValidationRule ValidatesOnTargetUpdatedTrue/v:RangeValidationRule/Binding.ValidationRules/Binding/TextBox.Text/TextBoxTextBlock VerticalAlignmentCenter Text{Binding DataError} ForegroundRed/TextBlock
/StackPanel 4. 数据类型转换示例演示 源码下载 本实例源码相对简单如果需要源码下载可关注公众号回复关键字DATAVC进行获取如下所示 以上就是【浅谈WPF之Binding时数据校验和类型转换】的全部内容关于更多详细内容可参考官方文档。希望能够一起学习共同进步。