防止无效的文本框输入绑定到业务对象属性?

时间:2012-04-04 18:40:42

标签: c# .net winforms validation data-binding

我有一个简单的winforms应用程序,其中包含一个表单,一些控件和一个定义如下的业务对象:

public class BusinessObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }

    private string _phoneNumber;
    public string PhoneNumber
    {
        get { return _phoneNumber; }
        set
        {
            if (_phoneNumber == value)
            {
                return;
            }

            _phoneNumber = value;
            OnPropertyChanged(new PropertyChangedEventArgs("PhoneNumber"));
        }
    }

在我的表单上,我有一个通过绑定源绑定到PhoneNumber属性的文本框,数据源更新模式设置为OnPropertyChanged。这一切都按预期工作。在将文本分配给业务对象上的PhoneNumber属性之前,我需要对文本进行一些验证。我以为我会在文本框的Validating事件处理程序中执行此操作,如果输入无效,则显示我的错误提供程序并设置e.Cancel = true。不幸的是,这并不能防止无效输入绑定到PhoneNumber属性。有一个简单的方法吗?

3 个答案:

答案 0 :(得分:1)

Data Validation可能只是你要找的东西。应该保持无效的输入来改变你的对象。

答案 1 :(得分:1)

正如mrlucmorin所建议的那样,我已将更新数据源模式从“OnPropertyChanged”更改为“OnValidation”,以便仅在文本框丢失并获得验证时才会发生绑定。我在我的文本框的Validating()事件处理程序中实现了验证,并在数据无效时设置e.Cancel = true。不幸的是,单击工具栏上的按钮似乎不会导致文本框失去焦点,因此Validating()事件永远不会触发,但我可以通过在单击工具栏按钮时调用ValidateChildren()来解决这个问题。再次感谢mrlucmorin和ImGreg提出的最终解决我问题的建议!

答案 2 :(得分:0)

根据msdn,您使用的事件是在值发生更改后发生的。一种选择是存储数据备份并恢复更改的值。但是,这不是一种理想的方法。

我会改变你如何验证控件。

我不确定何时这样做,因为它取决于代码的工作方式。当您不再关注文本框控件时,可能会执行自己的验证,或者在更新数据源时进行验证。

编辑:也许您正在寻找ErrorProvider Class。这可以用于处理您想要的验证。