2

我有一个简单的 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 属性之前,我需要对它进行一些验证。我认为我会在文本框的验证事件处理程序中执行此操作,如果输入无效,我会显示我的错误提供程序并设置 e.Cancel = true。不幸的是,这并不能阻止无效输入绑定到 PhoneNumber 属性。是否有捷径可寻?

4

3 回答 3

1

数据验证可能正是您正在寻找的东西。应防止无效输入更改您的对象。

于 2012-04-04T19:21:23.420 回答
1

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

于 2012-04-09T13:05:28.900 回答
0

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

我会改变你验证控件的方式。

我不确定何时执行此操作,因为这取决于您的代码如何工作。当您失去对文本框控件的关注时,可能执行您自己的验证,或者在要更新数据源时进行验证。

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

于 2012-04-04T19:19:12.903 回答