我有一个ViewModel类,其Phone属性作为其属性之一,我的主窗口数据上下文设置为ViewModel,我是否需要在底层Phone模型类或包含Phone属性的ViewModel类上实现IDataErrorInfo ?
另外,将我正在尝试验证的文本框绑定到我的ViewModel.NewPhone.StringProperty的正确方法是什么?
非常感谢
答案 0 :(得分:6)
决定实施IDataErrorInfo
的位置实际上取决于应用程序的逻辑。例如,您可以让Phone
课程以不允许任何无效电话号码的方式实施,但在您的viewmodel中,您只想允许来自美国的号码。
通常一个好的做法是在模型和视图模型中实现IDataErrorInfo
,如果viewmodel没有找到错误,请将请求转发给模型。然后你将像往常一样绑定到viewmodel。
public string this[string propertyName]
{
get
{
if (propertyName == "PhoneNumber")
{
if (!IsUSNumber(PhoneNumber))
{
return "Non-US number.";
}
}
// No validation errors found by the viewmodel
// Forward to model's IDataErrorInfo implementation
return Model[propertyName];
}
}
我建议让模型实现与每部手机相关的基本验证,例如电话号码格式,并让viewmodel实现视图特定的验证,这些验证可能因视图而异,例如仅允许美国电话号码或属于某个提供商的号码。