【问题标题】:IDataErrorInfo does not fire when binding to a complex object绑定到复杂对象时不会触发 IDataErrorInfo
【发布时间】: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


【解决方案1】:

IDataErrorInfo 仅在实现的级别触发

例如,如果您的绑定路径类似于“viewModel.property1.property2.property3”,则需要在 viewModel 类、property1 类和 property2 类中实现 IDataErrorInfo。 Property3 是一个字符串。

因此,为了让它为您工作,只需在其他任何地方实现 IDataErrorInfo。

【讨论】:

  • 谢谢,我会这样做的。完全让我大吃一惊。
  • 不是我希望的答案。这通常是做什么的?你会在每个模型中使用 IDataErrorInfo 吗?
  • 必须为每个嵌套级别实现 IDataErrorInfo - 有人可以提供指向 msdn 的链接吗?此处描述的相同问题social.msdn.microsoft.com/Forums/vstudio/en-US/…
  • @dev Hedgehog 的回答很有帮助。我的问题是,如果绑定路径中的“viewModel.property1.property2.property3”property2 为空,如何获得验证错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多