当前位置:  开发笔记 > 后端 > 正文

WPF验证整个表单

如何解决《WPF验证整个表单》经验,为你挑选了1个好方法。

我对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=trueValidation.ErrorTemplate

XAML:


    
        
    
    
        
        
        
        
    

这将创建一个Window带有两个TextBoxes的位置,您可以在其中编辑客户的名字和姓氏.只有在未发生验证错误时,才会启用"保存"按钮.该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业务对象,而不取决于业务对象.

虽然这确实比您提供的简单示例更多的代码,但它还具有比仅检查有效性更多的功能.这为用户提供了有关验证问题的细粒度和自动更新指示,并且只要用户尝试输入无效数据,就会自动禁用"保存"按钮.



1> David Schmit..:

如果输入的数据无效,WPF应用程序应禁用提交表单的按钮.您可以通过使用Bindings在业务对象上实现IDataErrorInfo接口来实现此目的.要在出现错误时自定义单个控件的外观,请设置a .ValidatesOnDataErrors=trueValidation.ErrorTemplate

XAML:


    
        
    
    
        
        
        
        
    

这将创建一个Window带有两个TextBoxes的位置,您可以在其中编辑客户的名字和姓氏.只有在未发生验证错误时,才会启用"保存"按钮.该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 _can_委托通过使用绑定并设置ValidatesOnDataErrors = true和/或ValidatesOnException = true来验证域级别.我的答案显示了一种方法.
如果您只需确保填写所有字段,则只需将验证代码放入提交按钮的Click处理程序即可.但是,您的用户会问"为什么我不能提交表格?" 你仍然需要实现所有的通知和东西.
当我需要的是确保所有字段都填满时,这似乎太多了.
验证规则是数据模型的一部分,而不是GUI.必须能够在没有GUI的情况下检查对象的有效性.例如,考虑面向批处理的数据处理器.
推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有