真的很简单的WPF表单数据validation – 如何?

我有这个非常简单的课程,我们称之为客户。 它看起来像这样:

namespace TestValidation { class Customer { private string _name; public string Name { get { return _name; } set { _name = value; if (String.IsNullOrEmpty(value)) { throw new Exception("Customer name is mandatory."); } } } } } 

现在,我已经创建了一个基本表单,用户可以在其中将客户添加到数据库中。 该表单包含简单的TextBox,绑定到Customer的Name属性,以及一个“Add”按钮。

XAML代码是:

    

从Name属性的setter中,您可以理解该名称对我来说是必需的,因此如果Name TextBox留空,我希望validation事件上升。 通过WPF的validation规则 – 一旦用户将焦点移出文本框,并且那里没有值 – 它应该将边框颜色更改为红色。 出于某种原因 – 这没有发生,我也不知道为什么。 我的过程有什么问题?

现在,我已经阅读了很多关于WPFvalidation的好文章(比如使用WPF执行复杂业务数据规则,WPF中的数据validation和Windows Presentation Foundation中的validation),但它们都没有帮助我解决我的问题。

最后,我希望表单看起来像Brian Noyes中第一个链接上的优秀文章(没有10个学分,所以我不能附上照片……对不起)。

如果有人能向我解释它是如何运作的,我将不胜感激。

重要提示 – 我正在使用.Net framework 4,因此我需要一个适合此版本的解决方案。

我肯定会建议使用IDataErrorInfo进行WPFvalidation,因为WPF已经了解如何使用它,并且易于实现。

首先,将接口添加到包含要validation的数据的类中。 所需的方法可能如下所示:

 public class Customer : IDataErrorInfo { ... #region IDataErrorInfo Members string IDataErrorInfo.Error { get { return null; } } string IDataErrorInfo.this[string columnName] { get { if (columnName == "Name") { // Validate property and return a string if there is an error if (string.IsNullOrEmpty(Name)) return "Name is Required"; } // If there's no error, null gets returned return null; } } #endregion } 

接下来,您需要在TextBox绑定中设置ValidatesOnDataErrors=True ,以便在Name属性更改时运行validation:

  

最后,在XAML中创建一个validation模板,告诉WPF如何绘制validation错误。 这是我经常使用的样式/模板:

   

此外,请确保您的Customer类实现了INotifyPropertyChanged以便它正确响应UI更新。 我没有在你的代码中看到这一点,但通常人们为了简单而将其留下:)

您没有指定validation规则。 在离开控件之前将调用validation规则,然后可以执行您想要validation输入的任何内容。

这里提供了一个简单的例子 – 我想这就是你想要做的事情。

使用IDataErrorInfo进行validation。 此链接将帮助您。

认为问题可能是你的类没有实现INotifyPropertyChanged,因此没有像你期望的那样绑定。

实现INotifyPropertyChanged接口,在属性更改时引发事件并且它应该工作。

有关演练,请参阅http://msdn.microsoft.com/en-us/library/ms743695(v=vs.110).aspx 。

我知道这篇文章很老了,但这里的内容对我很有用。 没有滞后或长编码,但我只在双值上使用它。 您可以根据需要进行更改。

  private void search_box_TextChanged(object sender, TextChangedEventArgs e) { // box text and background to normal state if user types numbers search_box.Foreground = Brushes.Black; search_box.Background = Brushes.White; if (search_id.IsSelected == true) { try { //convert while user is typing if (string.IsNullOrEmpty(search_box.Text)==false) Convert.ToDouble(search_box.Text); search_error.Text = null; } //if user types a letter or a space or a symbol ====> catch (Exception) { // user cant type any value other than numbers as exception prevents it and clears the box text value <====== search_box.Text = null; search_box.Foreground = Brushes.White; search_box.Background = Brushes.Red; search_error.Text="id is numberic value"; } } } 

希望能帮助到你。

                   

IntRangeRule类:

 public class IntRangeRule : ValidationRule { private int _min; private int _max; public IntRangeRule() { } public int Min { get { return _min; } set { _min = value; } } public int Max { get { return _max; } set { _max = value; } } public override ValidationResult Validate(object value, CultureInfo cultureInfo) { int l_input = 0; try { if (((string)value).Length > 0) { l_input = Int32.Parse((String)value); } } catch (Exception e) { return new ValidationResult(false, "Illegal characters or " + e.Message); } if ((l_input < Min) || (l_input > Max)) { return new ValidationResult(false, "Please enter an value in the range: " + Min + " - " + Max + "."); } return new ValidationResult(true, null); } }