[WPF系列]-Data Validation

项目经常前台界面涉及到用户输入时,我们常常会用到数据有效性的验证。在网页中我们之前用js来校验Form中的数据有效性。在WPF中我们如何实现这种验证机制了?答案:INotifyDataErrorInfo

 

INotifyDataErrorInfo简介

如图示该接口有三件宝贝:

  • HasErrors: a read-only boolean property which tells if the object as a whole have any validation errors;
  • GetErrors: a method which returns validation errors for a given property;
  • ErrorsChanged: an event which must be raised when new errors – or the lacks of errors – is detected. You have to raise this event for each property.

 

如何使用INotifyDataErrorInfo?

 

With the traditionnal IDataErrorInfo, you have to set to true the ValidatesOnDataErrors property on each binding to your object. There is nothing really new under the sun because this time you have to set the ValidatesOnNotifyDataErrors property to true.

In the linked demo project I create a form which display the properties of an object named ‘Person’. Here is how the validation with INotifyDataErrorInfo is enabled in the Binding:

<TextBox Text="{Binding Name,Mode=TwoWay,ValidatesOnNotifyDataErrors=True}"/>

The binding will then register itself for the ErrorsChanged event of the binded Person. Eeach time this event is raised for the binded property, the controls will dress itself to display an error. As pointed out before, this is done only if the HasErrors is set to true.

 

 

实例代码片段

 

public class ViewModel : INotifyDataErrorInfo
{
    private readonly IService _service;
    private readonly Dictionary<string, ICollection<string>>
        _validationErrors = new Dictionary<string, ICollection<string>>();

    public ViewModel(IService service)
    {
        _service = service;
    }

    ...

    #region INotifyDataErrorInfo members
    public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
    private void RaiseErrorsChanged(string propertyName)
    {
        if (ErrorsChanged != null)
            ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
    }

    public System.Collections.IEnumerable GetErrors(string propertyName)
    {
        if (string.IsNullOrEmpty(propertyName)
            || !_validationErrors.ContainsKey(propertyName))
            return null;

        return _validationErrors[propertyName];
    }

    public bool HasErrors
    {
        get { return _validationErrors.Count > 0; }
    }
    #endregion
}

TextBox 错误模板以及效果图:

<TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}">
    <Validation.ErrorTemplate>
        <ControlTemplate>
            <StackPanel>
                <!-- Placeholder for the TextBox itself -->
                <AdornedElementPlaceholder x:Name="textBox"/>
                <TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/>
            </StackPanel>
        </ControlTemplate>
    </Validation.ErrorTemplate>
</TextBox>

 

参考

WPF 4.5 – Part 1 : Asynchronous data validation

Data validation in WPF

时间: 2024-11-10 08:12:25

[WPF系列]-Data Validation的相关文章

WPF系列之三:实现类型安全的INotifyPropertyChanged接口,可以不用“Magic string” 么?

通常实现INotifyPropertyChanged接口很简单,为你的类只实现一个PropertyChanged 的Event就可以了. 例如实现一个简单的ViewModel1类: public class ViewModel1 : INotifyPropertyChanged { private string _data; public string Data { get { return _data; } set { if (_data == value) return; _data = v

[WPF系列]-Prism+EF

  源码:Prism5_Tutorial       参考文档 Data validation in WPF WPF 4.5 – ASYNCHRONOUS VALIDATION Reusable async validation for WPF with Prism 5 Validating our ViewModel Implementing a Data Access Layer with Entity Framework 6.1 - Part1 Implementing a Data Ac

[WPF系列-数据邦定之DataTemplate 根据对象属性切换模板

  引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate)   切换模板的两种方式:   使用DataTemplateSelector来切换模板 使用DataTrigger来实现模板切换. 使用Style来是实现模板切换   A DataTemplateSelector does not respond to PropertyChange notifications, so it doesn't get re-evaluated

WPF系列之二:解耦View层控件事件与ViewModel层事件的响应

以前的做法: 1.当项目的时间比较紧迫的时候,对UI层中控件的事件的处理,往往采取的是类似Winform中最简单的做法,直接做一个事件的Handler直接去调用VM层的方法. 2.控件只有一个Command属性,其它的事件的处理方法没有办法和ViewModel层进行解耦的时候往往也采取上面提到的方法. 如下图所示: 新的做法: 为了实现事件的处理与View层的解耦,我们可以利用WPF提供的附加属性来为需要的事件添加附加行为.附加属性扮演了一个在View层与Model层牵线的角色. 需要下面三个步

自学WPF系列(1)

介绍 使用WPF工作6个多月了,是时候写一些WPF的基础知识了.在这个主题上我已经写了几篇文章了.他们都是基于处理一些具体的问题而完成的.现在我抛砖引玉,并让您理解如何/为什么WPF作为革命性的UI开发走向了我们. 由于这是一篇适合初学者和中级水平的程序员的文章,我将尽量给出尽可能多的基本的例子. Windows Presectation Foundation 正如名字所示,WPF实际上是.NET Framework3.0引入的几个framework.它实际上是提出了一套新的类和程序集并允许我们

Excel中的Data Validation(控制输入值从下拉框选)

Excel中的Data Validation若用List实现,可以引用另一个Worksheet上的Cells中的内容吗? 在dict这个sheet里面 : Formulas->Name Manager定义新的名字Role(快捷键ctrl+F3,定义名称和区域), 在另一个sheet里面 : 选中一列 : Data->Data Validation,在source那儿输入你定义的名字:=Role OK,大功告成.

[WPF系列]-数据邦定之DataTemplate 对分层数据的支持

到目前为止,我们仅讨论如何绑定和显示单个集合. 某些时候,您要绑定的集合包含其他集合. HierarchicalDataTemplate 类专用于 HeaderedItemsControl 类型以显示这样的数据. 实例演示 在下面的示例中,ListLeagueList 是 League 对象的列表. 每个 League 对象都有一个 Name 和 Division 对象的集合. 每个 Division 都有一个 Name 和 Team 对象的集合,并且每个 Team 对象都有一个 Name. <

深入浅出WPF之Data Converter--笔记(2015.03.09)

BInding还有另外一种机制称为数据转换(Data Convert),当Source端Path所关联的数据与Target端目标属性数据类型不一致时,可以数据转换器(Data Converter).当WPF不能自动转换数据类型时,只能自己写Converter,方法是创建一个类并让这个类实现IValueConverter接口.当数据从Binding的Source流向Target时,Convert方法将被调用:反之,ConvertBack方法将被调用. BInding对象的Mode属性会影响到这两个

WPF系列——简单绑定学习

1. 绑定到元素对象.(实际项目中用处不大) 界面上两个关联的控件之间绑定,比如一个TextBlock 的FontSize和一个Slider 的Value绑定: <Slider Name="sliderFontText" Minimum="1" Maximum="100" Value="10"/> <TextBox Name="txtValue" Width="200"