我有一个简单的对话框,其中包含如下编辑框:
<TextBox Text="{Binding Path=EmailSettings.SmtpServer, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}" />
该对话框使用模型作为其数据上下文(为简化模型示例,未显示INotifyPropertyChanged,创建模型的代码也未显示,
将对话框数据上下文设置为模型实例):
class EmailSettingsModel : IDataErrorInfo
{
public EmailSettingsModel ()
{
EmailSettings = new EmailSettings();
}
public EmailSettings EmailSettings
{ get; set; }
string _error;
public string Error
{
get { return _error; }
set { _error = value; }
}
public string this[string propertyName]
{
get
{
string errorMessage = null;
if ( string.Compare( propertyName, "EmailSettings.SmtpServer" ) == 0 )
{
if ( !string.IsNullOrWhiteSpace( EmailSettings.SmtpServer ) )
errorMessage = "SMTP server is not valid";
}
Error = errorMessage;
}
}
}
该模型包含一个属性,该属性是一个简单的POCO类,上面具有多个属性。
class EmailSettings
{
public string SmtpServer
{ get; set; }
}
我无法启动IDataErrorInfo索引器,并花了数小时寻找。当我将文本框上的绑定(bind)更改为使用简单属性时:
<TextBox Text="{Binding Path=SmtpServer, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}" />
在模型上触发IDataErrorInfo索引器,如下所示。
class EmailSettingsModel
{
public string SmtpServer
{ get; set; }
}
是否未调用IDataErrorInfo,因为我对绑定(bind)语句使用了复合属性。我已经使用了像这样的复杂属性来进行正常的数据绑定(bind),并且它们可以正常工作,但是对于本示例,未调用IDataErrorInfo。
最佳答案
IDataErrorInfo仅在实现的级别上触发
例如,如果您的绑定(bind)路径看起来像“viewModel.property1.property2.property3”,则需要在viewModel类内以及property1类内以及property2类内实现IDataErrorInfo。 Property3是一个字符串。
因此,为了使其适合您,只需在其他任何地方实现IDataErrorInfo。