我有一个简单的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属性。有一个简单的方法吗?
答案 0 :(得分:1)
Data Validation可能只是你要找的东西。应该保持无效的输入来改变你的对象。
答案 1 :(得分:1)
正如mrlucmorin所建议的那样,我已将更新数据源模式从“OnPropertyChanged”更改为“OnValidation”,以便仅在文本框丢失并获得验证时才会发生绑定。我在我的文本框的Validating()事件处理程序中实现了验证,并在数据无效时设置e.Cancel = true。不幸的是,单击工具栏上的按钮似乎不会导致文本框失去焦点,因此Validating()事件永远不会触发,但我可以通过在单击工具栏按钮时调用ValidateChildren()来解决这个问题。再次感谢mrlucmorin和ImGreg提出的最终解决我问题的建议!
答案 2 :(得分:0)
根据msdn,您使用的事件是在值发生更改后发生的。一种选择是存储数据备份并恢复更改的值。但是,这不是一种理想的方法。
我会改变你如何验证控件。
我不确定何时这样做,因为它取决于代码的工作方式。当您不再关注文本框控件时,可能会执行自己的验证,或者在更新数据源时进行验证。
编辑:也许您正在寻找ErrorProvider Class。这可以用于处理您想要的验证。