我对WPF验证系统感到非常失望.无论如何!如何通过单击"按钮"验证完整表单?
出于某种原因,WPF中的所有东西都太复杂了!我可以在ASP.NET中的一行代码中进行验证,这需要在WPF中使用10-20行代码!
我可以使用自己的ValidationEngine框架来做到这一点:
Customer customer = new Customer(); customer.FirstName = "John"; customer.LastName = String.Empty; ValidationEngine.Validate(customer); if (customer.BrokenRules.Count > 0) { // do something display the broken rules! }
David Schmit.. 26
如果输入的数据无效,WPF应用程序应禁用提交表单的按钮.您可以通过使用Bindings在业务对象上实现IDataErrorInfo接口来实现此目的.要在出现错误时自定义单个控件的外观,请设置a .ValidatesOnDataErrors
=true
Validation.ErrorTemplate
这将创建一个Window
带有两个TextBox
es的位置,您可以在其中编辑客户的名字和姓氏.只有在未发生验证错误时,才会启用"保存"按钮.该TextBlock
按钮的下方显示当前的错误,这样用户就知道这是怎么回事.
默认值ErrorTemplate
是错误控件周围的细红色边框.如果这不适合您的视觉概念,请查看CodeProject上Windows Presentation Foundation文章中的验证,深入了解可以采取哪些措施.
要使窗口实际工作,窗口和客户中必须有一些基础结构.
// The CustomerWindow class receives the Customer to display // and manages the Save command public class CustomerWindow : Window { private Customer CurrentCustomer; public CustomerWindow(Customer c) { // store the customer for the bindings DataContext = CurrentCustomer = c; InitializeComponent(); } private void SaveCanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = ValidationEngine.Validate(CurrentCustomer); } private void SaveExecuted(object sender, ExecutedRoutedEventArgs e) { CurrentCustomer.Save(); } } public class Customer : IDataErrorInfo, INotifyPropertyChanged { // holds the actual value of FirstName private string FirstNameBackingStore; // the accessor for FirstName. Only accepts valid values. public string FirstName { get { return FirstNameBackingStore; } set { FirstNameBackingStore = value; ValidationEngine.Validate(this); OnPropertyChanged("FirstName"); } } // similar for LastName string IDataErrorInfo.Error { get { return String.Join("\n", BrokenRules.Values); } } string IDataErrorInfo.this[string columnName] { get { return BrokenRules[columnName]; } } }
一个明显的改进是将IDataErrorInfo
实现移到类层次结构中,因为它只取决于ValidationEngine
业务对象,而不取决于业务对象.
虽然这确实比您提供的简单示例更多的代码,但它还具有比仅检查有效性更多的功能.这为用户提供了有关验证问题的细粒度和自动更新指示,并且只要用户尝试输入无效数据,就会自动禁用"保存"按钮.
如果输入的数据无效,WPF应用程序应禁用提交表单的按钮.您可以通过使用Bindings在业务对象上实现IDataErrorInfo接口来实现此目的.要在出现错误时自定义单个控件的外观,请设置a .ValidatesOnDataErrors
=true
Validation.ErrorTemplate
这将创建一个Window
带有两个TextBox
es的位置,您可以在其中编辑客户的名字和姓氏.只有在未发生验证错误时,才会启用"保存"按钮.该TextBlock
按钮的下方显示当前的错误,这样用户就知道这是怎么回事.
默认值ErrorTemplate
是错误控件周围的细红色边框.如果这不适合您的视觉概念,请查看CodeProject上Windows Presentation Foundation文章中的验证,深入了解可以采取哪些措施.
要使窗口实际工作,窗口和客户中必须有一些基础结构.
// The CustomerWindow class receives the Customer to display // and manages the Save command public class CustomerWindow : Window { private Customer CurrentCustomer; public CustomerWindow(Customer c) { // store the customer for the bindings DataContext = CurrentCustomer = c; InitializeComponent(); } private void SaveCanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = ValidationEngine.Validate(CurrentCustomer); } private void SaveExecuted(object sender, ExecutedRoutedEventArgs e) { CurrentCustomer.Save(); } } public class Customer : IDataErrorInfo, INotifyPropertyChanged { // holds the actual value of FirstName private string FirstNameBackingStore; // the accessor for FirstName. Only accepts valid values. public string FirstName { get { return FirstNameBackingStore; } set { FirstNameBackingStore = value; ValidationEngine.Validate(this); OnPropertyChanged("FirstName"); } } // similar for LastName string IDataErrorInfo.Error { get { return String.Join("\n", BrokenRules.Values); } } string IDataErrorInfo.this[string columnName] { get { return BrokenRules[columnName]; } } }
一个明显的改进是将IDataErrorInfo
实现移到类层次结构中,因为它只取决于ValidationEngine
业务对象,而不取决于业务对象.
虽然这确实比您提供的简单示例更多的代码,但它还具有比仅检查有效性更多的功能.这为用户提供了有关验证问题的细粒度和自动更新指示,并且只要用户尝试输入无效数据,就会自动禁用"保存"按钮.