【问题标题】:IDataErrorInfo and not null properties binding validationIDataErrorInfo 和非空属性绑定验证
【发布时间】:2013-11-27 11:49:41
【问题描述】:

我正在使用 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 为空时,我收到一个异常,指出它无法转换值 ''。这显然是抛出的,因为 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}" />

谢谢!

【问题讨论】:

    标签: c# wpf data-binding idataerrorinfo


    【解决方案1】:

    你所经历的一切都是正常的。

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

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

    public long? TributaryCode { get; set; }
    

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

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

    【讨论】:

    • 感谢您的回答。我已经“屏蔽”了 TributaryCode 文本框以限制用户只允许数字。我想知道解决方案是否使用 long?反而长了。然后,关于验证,我认为文本框在获得焦点然后失去焦点时进行验证。不是在它初始化时。我不喜欢用户打开一个窗口并看到一个窗口充满带有红色边框的文本框,而他甚至没有尝试完成一个。你明白我的意思吗?
    • 您可以尝试将每个TextBox 控件上的Binding.UpdateSourceTrigger 更改为LostFocus,这应该延迟Binding 更新直到TextBox 失去焦点,但我不能保证这样做会消除启动验证错误。
    • 是的,我做到了。我的问题中的 XAML 代码显示了它。我确信这种行为不会发生在窗口中。不过必须检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多