我的WPF应用程序中有以下代码,我正在尝试实现输入验证。
型号:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
视图模型:
public class CustomerViewModel : Screen, IDataErrorInfo
{
private Customer _customer;
public Customer Customer
{
get { return _customer; }
set
{
if (_customer != value)
{
_customer = value;
NotifyOfPropertyChange(() => Customer);
}
}
}
public string Error
{
get
{
throw new NotImplementedException();
}
}
public string this[string columnName]
{
get
{
string result = null;
if (columnName == "Name")
{
if (string.IsNullOrEmpty(Customer.Name))
result = "Please enter a Name";
if (Customer.Name.Length < 3)
result = "Name is too short";
}
return result;
}
}
}
查看:
<TextBox Text="{Binding Customer.Name, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>
问题: 解决方案无法按预期工作。在文本框中键入数据时没有任何反应。我不确定天气是否遵循了正确的步骤。
有人可以帮助我吗?
答案 0 :(得分:1)
我认为问题出现是因为视图模型中没有Name
属性(但在Customer
类中)。
您在绑定Customer.Name
中使用嵌套属性。
我没有将此与IDataErrorInfo
验证结合使用。
目前您查看模型索引器的条件不会被命中:
if (columnName == "Name")
{
...
}
因为从不调用索引器。
我的建议
向您的视图模型添加Name
属性,该属性将代表客户名称。
然后,您可以使用客户类(如设置
Name = customer.Name
在视图模型构造函数中。
您的绑定需要更改为
<TextBox Text="{Binding Name ....
执行此操作后,索引器应该正常工作,因为现在视图模型中存在Name
属性。
也许有另一种解决方案可以让你保持当前的嵌套绑定(Customer.Name
),但我肯定不知道。