我使用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}" />
谢谢!
答案 0 :(得分:1)
您所经历的一切都很正常。
我遇到的问题是,当TributaryCode为空时,我得到一个异常,说它无法转换值''
如果这真的困扰你,你有很多解决方案;您可以使用0
初始化值;您可以添加PreviewKeyDown
处理程序以仅允许long
值;你可以使用nullable long
:
public long? TributaryCode { get; set; }
当窗口加载并加载UserControl时,我所有空的TextBox都已经有红色边框,表明它没有通过验证
同样,这是正常的......当物业没有价值时,您还期望发生什么?这称为预测性验证,用户在尝试保存之前会收到错误的警告。就个人而言,我更喜欢这个系统,因为用户总是知道他们能做什么,不能做什么。