IDataErrorInfo而不是null属性绑定验证

时间:2013-11-27 11:49:42

标签: c# wpf data-binding idataerrorinfo

我使用IDataError来验证控件和文本框中的对象属性。 在我的课上,我添加了一些验证,然后我将绑定添加到文本框控件。

这是我的班级:

public class Customer : IDataErrorInfo
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public long TributaryCode { get; set; }

        #region IDataErrorInfo Members

        public string Error
        {
            get { throw new NotImplementedException(); }
        }

        public string this[string columnName]
        {
            get
            {
                string result = null;
                if (columnName == "FirstName")
                {
                    if (string.IsNullOrEmpty(FirstName))
                        result = "Please enter a First Name";
                }
                if (columnName == "LastName")
                {
                    if (string.IsNullOrEmpty(LastName))
                        result = "Please enter a Last Name";
                }
                return result;
            }
        }

        #endregion
    }

我遇到的问题是,当TributaryCode为空时,我得到一个异常,说它无法转换值''。由于支流代码很长并且不支持空值,因此可以抛出这种情况。 此外,当包含文本框的UserControl加载时,该值显示为0.我想要的是从空开始,当文本框为空时,不抛出该异常。

然后,我需要做什么?我是否必须将所有属性都写为可空?然后这些类转换为WCF服务的请求类,所以这是一个可能的解决方案,但我想问这是否正确。

另外,正如我所说,所有这些控件都在UserControl中。我有一个窗口,其中包含一个包含此UserControl的ScrollViewer。 验证是在文本框的LostFocus事件中完成的,但由于某种原因,当窗口加载并加载UserControl时,我所有的空文本框都已经有红色边框,表明它没有通过验证。 为什么会发生这种情况?我想这肯定与UserControl项目有关。

这是我的一个文本框XAML:

<TextBox x:Name="tbFirstName" Grid.Row="0" Grid.Column="1"
     Text="{Binding UpdateSourceTrigger=LostFocus, Path=FirstName,
            ValidatesOnDataErrors=true, NotifyOnValidationError=true}" />

谢谢!

1 个答案:

答案 0 :(得分:1)

您所经历的一切都很正常。

  

我遇到的问题是,当TributaryCode为空时,我得到一个异常,说它无法转换值''

如果这真的困扰你,你有很多解决方案;您可以使用0初始化值;您可以添加PreviewKeyDown处理程序以仅允许long值;你可以使用nullable long

public long? TributaryCode { get; set; }
  

当窗口加载并加载UserControl时,我所有空的TextBox都已经有红色边框,表明它没有通过验证

同样,这是正常的......当物业没有价值时,您还期望发生什么?这称为预测性验证,用户在尝试保存之前会收到错误的警告。就个人而言,我更喜欢这个系统,因为用户总是知道他们能做什么,不能做什么。