2012-04-04 69 views
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")); 
     } 
    } 

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

+1

由于您将更新模式设置为OnPropertyChanged,这意味着数据会在每个击键上被推送到对象。你的验证逻辑如何处理?我的意思是,你不应该等到用户在验证之前完成输入数字吗? – 2012-04-05 00:12:40

+0

你是对的。 :-(文本框的目的是为用户输入一个未格式化的电话号码(通过未格式化,我的意思是只有数字,没有+符号,破折号,parens等)我目前没有做任何类型的输入过滤keydown或按键,这样他们就可以输入ABC并且它会接受它,并且,正如你所指出的那样,使用OnPropertyChanged,在我可以验证它之前,该输入会被推送到每个击键上的对象上,我想我应该使用更新模式对此文本框的OnValidation? – user685869 2012-04-05 13:01:04

回答

1

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

0

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

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

我不确定什么时候这样做,因为它取决于您的代码如何工作。也许在你失去对文本框控件的关注时执行你自己的验证,或者当数据源被更新时进行验证。

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

+0

感谢您的建议! – user685869 2012-04-09 12:59:18

1

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

+0

谢谢你的尖叫。我之前通过Google搜索遇到过这种情况,但它看起来像适用于WPF。 – user685869 2012-04-04 19:37:27

+0

meh,傻我,没有看到你使用winforms。将不会真的工作。 – shriek 2012-04-04 20:24:54

+0

请参阅我的编辑@ user685869。 – ImGreg 2012-04-04 21:27:18