【发布时间】:2013-11-29 12:50:48
【问题描述】:
我有一个简单的对话框,其中包含如下编辑框:
<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 索引器并花了数小时寻找。当我将文本框上的绑定更改为使用简单属性时:
<TextBox Text="{Binding Path=SmtpServer, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=LostFocus}" />
在模型上如下 IDataErrorInfo 索引器被触发。
class EmailSettingsModel
{
public string SmtpServer
{ get; set; }
}
没有调用 IDataErrorInfo 是因为我为绑定语句使用了复合属性。我已经将这样的复杂属性用于普通数据绑定并且它们可以工作,但是对于这个示例,没有调用 IDataErrorInfo。
【问题讨论】:
-
如果嵌套属性没有触发 PropertyChanged,它就不会被调用。即使是这样,我也不确定包装器模型的 IDataErrorInfo 是否会被调用。系统如何知道何时调用它?你可以改用 INotifyDataErrorInfo (msdn.microsoft.com/en-us/library/…) 吗?
-
PropertyChanged 在模式和 EmailSettings 类中实现,我将它们省略以缩短示例。我们在 .net 4 上运行,将不得不等待 INotifyDataErrorInfo。
标签: wpf