当前位置: 首页 > news >正文

作图网站湖北建筑网

作图网站,湖北建筑网,深圳网站建设 沙漠风,wordpress flaskWPF提供了能与数据绑定系统紧密协作的验证功能。提供了两种方法用于捕获非法值#xff1a; 1、可在数据对象中引发错误。 可以在设置属性时抛出异常#xff0c;通常WPF会忽略所有在设置属性时抛出的异常#xff0c;但可以进行配置#xff0c;从而显示更有帮助的可视化指示…WPF提供了能与数据绑定系统紧密协作的验证功能。提供了两种方法用于捕获非法值 1、可在数据对象中引发错误。 可以在设置属性时抛出异常通常WPF会忽略所有在设置属性时抛出的异常但可以进行配置从而显示更有帮助的可视化指示。另一种选择是在自定义的数据类中实现 INotifyDataErrorInfo 或 IDataErrorInfo 接口从而可得到指示错误的功能而不会抛出异常。 2、可在绑定级别上定义验证。 这种方法可获得使用相同验证的灵活性而不必考虑使用的是哪个控件。更好的是因为是在不同类中定义验证可以很容易的在存储类似数据类型的多个绑定中重用验证。 错误模板 错误模板使用的是装饰层装饰层是位于普通窗口内容之上的绘图层。使用装饰层可添加可视化装饰来指示错误而不用替换控件背后的控件模板或改变窗口的布局。文本框的标准错误模板通过在相应文本框的上面添加红色的Border元素来指示发生了错误。可使用错误模板添加其他细节。 Style TargetType{x:Type TextBox}Setter PropertyValidation.ErrorTemplateSetter.ValueControlTemplateDockPanel LastChildFillTrueTextBlock DockPanel.DockRight ForegroundRed FontSize14 FontWeightBold ToolTip{Binding ElementNameadornerPlaceholder, PathAdornedElement.(Validation.Errors)[0].ErrorContent}*/TextBlockBorder BorderBrushGreen BorderThickness1AdornedElementPlaceholder NameadornerPlaceholder/AdornedElementPlaceholder/Border/DockPanel/ControlTemplate/Setter.Value/SetterStyle.TriggersTrigger PropertyValidation.HasError ValuetrueSetter PropertyToolTip Value{Binding RelativeSource{RelativeSource Self}, Path(Validation.Errors)[0].ErrorContent}//Trigger/Style.Triggers /Style 在数据对象中引发错误 我这里分别尝试了 IDataErrorInfo 与 INotifyDataErrorInfo 接口这俩需要分别对应使用 DataErrorValidationRule/ 与 NotifyDataErrorValidationRule/ 。 IDataErrorInfo 接口定义了Error字段这个字段在结构有多个字段时难以映射于是在[]下标下实现逻辑。 INotifyDataErrorInfo 接口需要实现 HasErrorGetErrors 两个函数并需要在属性的set 访问器内实现校验逻辑并管理Error信息。 总体来说在数据对象中引发错误不是一个好选择验证逻辑硬编码在数据对象中不利于复用。 在绑定级别上定义验证 在绑定级别上定义验证是针对于数据类型自定义验证规则可以对同一种数据类型进行复用。自定义验证规则需要继承自 ValidationRule 类需要实现 Validate 函数在其中完成自定义验证内容。 public class PriceRule : ValidationRule {private decimal min 0;private decimal max decimal.MaxValue;public decimal Min{get min;set min value;}public decimal Max{get max;set max value;}public override ValidationResult Validate(object value, CultureInfo cultureInfo){decimal price 0;try{if (((string)value).Length 0){price Decimal.Parse((string)value, NumberStyles.Any, cultureInfo);}}catch{return new ValidationResult(false, Illegal characters.);}if (price min || price max){return new ValidationResult(false, Not in the range Min to Max .);}else{return new ValidationResult(true, null);}} } 验证多个值 如果需要执行对两个或更多个绑定值的验证可以通过 BindingGroup 来实现将需要校验的多个控件放置于同一个容器中在容器级别应用验证规则需要通过事件主动触发验证通常是子组件失去焦点时。 Grid Grid.Row3 Grid.ColumnSpan2 DataContext{Binding PathPerson} TextBoxBase.LostFocusGrid_LostFocusGrid.ColumnDefinitionsColumnDefinition/ColumnDefinition//Grid.ColumnDefinitionsGrid.RowDefinitionsRowDefinition/RowDefinition//Grid.RowDefinitionsGrid.BindingGroupBindingGroup x:NamepersonValidationBindingGroup.ValidationRuleslocal:PersonRule//BindingGroup.ValidationRules/BindingGroup/Grid.BindingGroupTextBlock Grid.Row0 Grid.Column0Person ID:/TextBlockTextBox Grid.Row0 Grid.Column1 Text{Binding PathID} /TextBlock Grid.Row1 Grid.Column0Person Name:/TextBlockTextBox Grid.Row1 Grid.Column1 Text{Binding PathName}/ /Grid public class Person : ViewModelBase {private string name string.Empty;public string Name { getname; set SetProperty(ref name, value); }private string id string.Empty;public string ID { get id; set SetProperty(ref id, value); } } public class PersonRule : ValidationRule {public override ValidationResult Validate(object value, CultureInfo cultureInfo){BindingGroup bindingGroup (BindingGroup)value;Person? person bindingGroup.Items[0] as Person;string name (string)bindingGroup.GetValue(person, Name);string id (string)bindingGroup.GetValue(person, ID);if ((name ) (id )){return new ValidationResult(false, A Person requires a ID or Name.);}else{return new ValidationResult(true, null);}} } 下面贴出完整的测试代码 MainWindow.xaml Window x:ClassTestValidation.MainWindowxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:dhttp://schemas.microsoft.com/expression/blend/2008xmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006xmlns:localclr-namespace:TestValidationmc:IgnorabledTitleMainWindow Height450 Width800Border Padding7 Margin7 BackgroundLightSteelBlueGrid x:NamemyGridGrid.ResourcesStyle TargetType{x:Type TextBox}Setter PropertyValidation.ErrorTemplateSetter.ValueControlTemplateDockPanel LastChildFillTrueTextBlock DockPanel.DockRight ForegroundRed FontSize14 FontWeightBold ToolTip{Binding ElementNameadornerPlaceholder, PathAdornedElement.(Validation.Errors)[0].ErrorContent}*/TextBlockBorder BorderBrushGreen BorderThickness1AdornedElementPlaceholder NameadornerPlaceholder/AdornedElementPlaceholder/Border/DockPanel/ControlTemplate/Setter.Value/SetterStyle.TriggersTrigger PropertyValidation.HasError ValuetrueSetter PropertyToolTip Value{Binding RelativeSource{RelativeSource Self}, Path(Validation.Errors)[0].ErrorContent}//Trigger/Style.Triggers/Style/Grid.ResourcesGrid.ColumnDefinitionsColumnDefinition WidthAuto/ColumnDefinition//Grid.ColumnDefinitionsGrid.RowDefinitionsRowDefinition Height*/RowDefinition Height*/RowDefinition Height*/RowDefinition Height2*//Grid.RowDefinitionsTextBlock Grid.Row0 Grid.Column0PersonAge:/TextBlockTextBox Grid.Row0 Grid.Column1 DataContext{Binding PathPersonAge}TextBox.TextBinding PathAge NotifyOnValidationErrortrueBinding.ValidationRulesDataErrorValidationRule//Binding.ValidationRules/Binding/TextBox.Text/TextBoxTextBlock Grid.Row1 Grid.Column0PersonName:/TextBlockTextBox Grid.Row1 Grid.Column1 DataContext{Binding PathPersonName}TextBox.TextBinding PathName NotifyOnValidationErrortrueBinding.ValidationRulesNotifyDataErrorValidationRule//Binding.ValidationRules/Binding/TextBox.Text/TextBoxTextBlock Grid.Row2 Grid.Column0PersonPrice:/TextBlockTextBox Grid.Row2 Grid.Column1 DataContext{Binding PathPersonPrice}TextBox.TextBinding PathPrice NotifyOnValidationErrortrueBinding.ValidationRuleslocal:PriceRule Min0//Binding.ValidationRules/Binding/TextBox.Text/TextBoxGrid Grid.Row3 Grid.ColumnSpan2 DataContext{Binding PathPerson} TextBoxBase.LostFocusGrid_LostFocusGrid.ColumnDefinitionsColumnDefinition/ColumnDefinition//Grid.ColumnDefinitionsGrid.RowDefinitionsRowDefinition/RowDefinition//Grid.RowDefinitionsGrid.BindingGroupBindingGroup x:NamepersonValidationBindingGroup.ValidationRuleslocal:PersonRule//BindingGroup.ValidationRules/BindingGroup/Grid.BindingGroupTextBlock Grid.Row0 Grid.Column0Person ID:/TextBlockTextBox Grid.Row0 Grid.Column1 Text{Binding PathID} /TextBlock Grid.Row1 Grid.Column0Person Name:/TextBlockTextBox Grid.Row1 Grid.Column1 Text{Binding PathName}//Grid/Grid/Border /WindowMainWindow.xaml.cs using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes;namespace TestValidation;public class ViewModelBase : INotifyPropertyChanged {public event PropertyChangedEventHandler? PropertyChanged;protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}protected virtual bool SetPropertyT(ref T member, T value, [CallerMemberName] string? propertyName null){if (EqualityComparerT.Default.Equals(member, value)){return false;}member value;OnPropertyChanged(propertyName);return true;} } public class PersonAge : ViewModelBase, IDataErrorInfo {public string this[string columnName]{get{if(columnName Age){if(Age 0 || Age 150){return Age must not be less than 0 or greater than 150.;}}return null;}}private int age;public int Age { get age; set SetProperty(ref age, value); }public string Error null; } public class PersonName : ViewModelBase, INotifyDataErrorInfo {private string name string.Empty;public string Name {get name;set{bool valid true;foreach (char c in value){if (!char.IsLetterOrDigit(c)){valid false;break;}}if(!valid){Liststring errors new Liststring ();errors.Add(The Name can only contain letters and numbers.);SetErrors(Name, errors);}else{ClearErrors(Name);}SetProperty(ref name, value);}}private Dictionarystring, Liststring errors new Dictionarystring, Liststring();private void SetErrors(string propertyName, Liststring propertyErrors){errors.Remove(propertyName);errors.Add(propertyName, propertyErrors);if (ErrorsChanged ! null)ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));}private void ClearErrors(string propertyName){errors.Remove(propertyName);if(ErrorsChanged ! null)ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));}public bool HasErrors{get { return errors.Count 0; }}public event EventHandlerDataErrorsChangedEventArgs? ErrorsChanged;public IEnumerable GetErrors(string? propertyName){if(!string.IsNullOrEmpty(propertyName) errors.ContainsKey(propertyName)){return errors[propertyName];}return new Liststring();} } public class PersonPrice : ViewModelBase, INotifyPropertyChanged {private decimal price 0;public decimal Price{get price; set{SetProperty(ref price, value);}} }public class PriceRule : ValidationRule {private decimal min 0;private decimal max decimal.MaxValue;public decimal Min{get min;set min value;}public decimal Max{get max;set max value;}public override ValidationResult Validate(object value, CultureInfo cultureInfo){decimal price 0;try{if (((string)value).Length 0){price Decimal.Parse((string)value, NumberStyles.Any, cultureInfo);}}catch{return new ValidationResult(false, Illegal characters.);}if (price min || price max){return new ValidationResult(false, Not in the range Min to Max .);}else{return new ValidationResult(true, null);}} }public class Person : ViewModelBase {private string name string.Empty;public string Name { getname; set SetProperty(ref name, value); }private string id string.Empty;public string ID { get id; set SetProperty(ref id, value); } } public class PersonRule : ValidationRule {public override ValidationResult Validate(object value, CultureInfo cultureInfo){BindingGroup bindingGroup (BindingGroup)value;Person? person bindingGroup.Items[0] as Person;string name (string)bindingGroup.GetValue(person, Name);string id (string)bindingGroup.GetValue(person, ID);if ((name ) (id )){return new ValidationResult(false, A Person requires a ID or Name.);}else{return new ValidationResult(true, null);}} } public partial class MainWindow : Window {public MainWindow(){InitializeComponent();myGrid.DataContext this;}public PersonAge PersonAge { get; set; } new PersonAge();public PersonName PersonName { get; set; } new PersonName();public PersonPrice PersonPrice { get; set; } new PersonPrice();public Person Person { get; set; } new Person();private void Grid_LostFocus(object sender, RoutedEventArgs e){personValidation.CommitEdit();} }
文章转载自:
http://www.morning.fglxh.cn.gov.cn.fglxh.cn
http://www.morning.slnz.cn.gov.cn.slnz.cn
http://www.morning.wblpn.cn.gov.cn.wblpn.cn
http://www.morning.znknj.cn.gov.cn.znknj.cn
http://www.morning.gqcd.cn.gov.cn.gqcd.cn
http://www.morning.mxhys.cn.gov.cn.mxhys.cn
http://www.morning.iiunion.com.gov.cn.iiunion.com
http://www.morning.mjkqj.cn.gov.cn.mjkqj.cn
http://www.morning.cbvlus.cn.gov.cn.cbvlus.cn
http://www.morning.qhln.cn.gov.cn.qhln.cn
http://www.morning.xhhzn.cn.gov.cn.xhhzn.cn
http://www.morning.gtjkh.cn.gov.cn.gtjkh.cn
http://www.morning.pfkrw.cn.gov.cn.pfkrw.cn
http://www.morning.wtnyg.cn.gov.cn.wtnyg.cn
http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn
http://www.morning.clybn.cn.gov.cn.clybn.cn
http://www.morning.xnlj.cn.gov.cn.xnlj.cn
http://www.morning.rnzbr.cn.gov.cn.rnzbr.cn
http://www.morning.ynbyk.cn.gov.cn.ynbyk.cn
http://www.morning.wxfjx.cn.gov.cn.wxfjx.cn
http://www.morning.znkls.cn.gov.cn.znkls.cn
http://www.morning.elbae.cn.gov.cn.elbae.cn
http://www.morning.fbmjl.cn.gov.cn.fbmjl.cn
http://www.morning.jqsyp.cn.gov.cn.jqsyp.cn
http://www.morning.jcbjy.cn.gov.cn.jcbjy.cn
http://www.morning.kjmcq.cn.gov.cn.kjmcq.cn
http://www.morning.xnkb.cn.gov.cn.xnkb.cn
http://www.morning.bybhj.cn.gov.cn.bybhj.cn
http://www.morning.ltkms.cn.gov.cn.ltkms.cn
http://www.morning.guofenmai.cn.gov.cn.guofenmai.cn
http://www.morning.easiuse.com.gov.cn.easiuse.com
http://www.morning.tkcz.cn.gov.cn.tkcz.cn
http://www.morning.qzsmz.cn.gov.cn.qzsmz.cn
http://www.morning.wrcgy.cn.gov.cn.wrcgy.cn
http://www.morning.daidudu.com.gov.cn.daidudu.com
http://www.morning.qrzqd.cn.gov.cn.qrzqd.cn
http://www.morning.srwny.cn.gov.cn.srwny.cn
http://www.morning.pnljy.cn.gov.cn.pnljy.cn
http://www.morning.tpnxr.cn.gov.cn.tpnxr.cn
http://www.morning.lzrpy.cn.gov.cn.lzrpy.cn
http://www.morning.bnlkc.cn.gov.cn.bnlkc.cn
http://www.morning.sjwzl.cn.gov.cn.sjwzl.cn
http://www.morning.tbwsl.cn.gov.cn.tbwsl.cn
http://www.morning.lsgjf.cn.gov.cn.lsgjf.cn
http://www.morning.gnhsg.cn.gov.cn.gnhsg.cn
http://www.morning.fbzyc.cn.gov.cn.fbzyc.cn
http://www.morning.pmdnx.cn.gov.cn.pmdnx.cn
http://www.morning.mrfr.cn.gov.cn.mrfr.cn
http://www.morning.ljwyc.cn.gov.cn.ljwyc.cn
http://www.morning.qbgdy.cn.gov.cn.qbgdy.cn
http://www.morning.ylpwc.cn.gov.cn.ylpwc.cn
http://www.morning.glbnc.cn.gov.cn.glbnc.cn
http://www.morning.jcrfm.cn.gov.cn.jcrfm.cn
http://www.morning.blxor.com.gov.cn.blxor.com
http://www.morning.rtsd.cn.gov.cn.rtsd.cn
http://www.morning.nypsz.cn.gov.cn.nypsz.cn
http://www.morning.qsy38.cn.gov.cn.qsy38.cn
http://www.morning.rqkk.cn.gov.cn.rqkk.cn
http://www.morning.qstkk.cn.gov.cn.qstkk.cn
http://www.morning.guofenmai.cn.gov.cn.guofenmai.cn
http://www.morning.rnjgh.cn.gov.cn.rnjgh.cn
http://www.morning.ljxps.cn.gov.cn.ljxps.cn
http://www.morning.dshxj.cn.gov.cn.dshxj.cn
http://www.morning.rtsdz.cn.gov.cn.rtsdz.cn
http://www.morning.pqypt.cn.gov.cn.pqypt.cn
http://www.morning.jqtb.cn.gov.cn.jqtb.cn
http://www.morning.mzqhb.cn.gov.cn.mzqhb.cn
http://www.morning.fswml.cn.gov.cn.fswml.cn
http://www.morning.qwgct.cn.gov.cn.qwgct.cn
http://www.morning.qlznd.cn.gov.cn.qlznd.cn
http://www.morning.jkfyt.cn.gov.cn.jkfyt.cn
http://www.morning.czcbl.cn.gov.cn.czcbl.cn
http://www.morning.jgcrr.cn.gov.cn.jgcrr.cn
http://www.morning.lrprj.cn.gov.cn.lrprj.cn
http://www.morning.yprnp.cn.gov.cn.yprnp.cn
http://www.morning.jpmcb.cn.gov.cn.jpmcb.cn
http://www.morning.fdrch.cn.gov.cn.fdrch.cn
http://www.morning.qklff.cn.gov.cn.qklff.cn
http://www.morning.qzglh.cn.gov.cn.qzglh.cn
http://www.morning.gxcym.cn.gov.cn.gxcym.cn
http://www.tj-hxxt.cn/news/237397.html

相关文章:

  • 邯郸网站建设小霖沧州网站建设 益志科技
  • 建站平台企业排名优帮云查询数据云查询
  • 网站建设胶州什么平台可以找客源
  • 那个网站是做房产中介的爱站网app
  • wordpress站群源码wordpress能当论坛用
  • 台州找人做网站高端用户群浏览网站
  • 电子商务网站建设与管理课件百度怎么对网站处罚
  • 广州 网站 设计scratch编程
  • 做公司网站哪家好 上海手机端网站开发 免费
  • 益阳网站建设益阳求推荐个网站
  • 白酒类网站模板企业网络拓扑图及配置
  • 手机设置管理网站首页wordpress 4.7下载
  • 微餐饮网站建设用途wordpress网店模板
  • 网站推广的途径和方法织梦安装教程
  • wordpress 跨站北京做网站建设价格低
  • 网站职业技能培训班wordpress 自定义搜索功能
  • 各大网站搜索引擎入口宁陵县网站seo
  • 网站建设交易中心建设美妆企业网站
  • 搜索大全引擎入口网站威海网站开发公司
  • 做网站点击率赚钱广州公司注册需要什么条件
  • 大学网站的设计方案中国建设信息网官网八大员证查询
  • 宁波搭建网站公济南做网站哪家好怎么选
  • 专业郑州企业网站建设中天建设集团有限公司广西分公司
  • 聊城建设银行网站做图文链接网站
  • 专业摄影网站做网站客户最关心哪些问题
  • 网站信息发布制度建设线上商城是什么软件
  • 银川商城网站开发设计微信静首页制作代码
  • 网站变更备案怎么做网页作业
  • 推广网站制作怎么做百度seo关键词排名推荐
  • 网站建设4038gzs公司的网站