我想在WPF中做一些简单的文本框验证,但我刚刚意识到IDataErrorInfo依赖于引发PropertyChanged事件以触发验证,这意味着在验证发生之前将无效值应用于我的绑定对象。有没有办法改变这一点,以便首先进行验证(并防止对无效数据进行绑定),还是有另一种解决方案可以这样工作?
修剪下来的代码如下所示:
<TextBox>
<TextBox.Text>
<Binding Path="MyProperty" ValidatesOnDataErrors="True" />
</TextBox.Text>
</TextBox>
public class MyViewModel : IDataErrorInfo
{
public string MyProperty
{
get { return _myProperty; }
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged(() => MyProperty);
SaveSettings();
}
}
}
public string Error
{
get { return string.Empty; }
}
public string this[string columnName]
{
get
{
if (columnName == "MyProperty")
return "ERROR";
return string.Empty;
}
}
}
答案 0 :(得分:1)
使用的更好的界面和验证方法(如果使用.net 4.5)是INotifyDataErrorInfo
。它的主要优点是允许您控制验证的发生时间和方式。一个很好的概述:
http://anthymecaillard.wordpress.com/2012/03/26/wpf-4-5-validation-asynchrone/
答案 1 :(得分:0)
我不认为每次属性更改时都需要调用SaveSettings()方法。我认为应该在用户点击“保存”按钮时调用它,而不是在属性更改时调用。但是,如果您仍希望保存更改的属性更改,则只应在没有可用的验证错误的情况下执行此操作。例如:
public class MyViewModel : IDataErrorInfo
{
public string MyProperty
{
get { return _myProperty; }
set
{
if (_myProperty != value)
{
_myProperty = value;
NotifyPropertyChanged(() => MyProperty);
if (string.IsNullOrEmpty(this["MyProperty"]))
{
SaveSettings();
}
}
}
}
public string Error
{
get { return string.Empty; }
}
public string this[string columnName]
{
get
{
if (columnName == "MyProperty")
return "ERROR";
return string.Empty;
}
}
}