我有一个带有 Phone 对象作为其属性之一的 ViewModel 类,我的主窗口数据上下文设置为 ViewModel,我是否需要在底层 Phone 模型类或包含 Phone 属性的 ViewModel 类上实现 IDataErrorInfo?
另外,将我要验证的文本框绑定到我的 ViewModel.NewPhone.StringProperty 的正确方法是什么?
非常感谢
我有一个带有 Phone 对象作为其属性之一的 ViewModel 类,我的主窗口数据上下文设置为 ViewModel,我是否需要在底层 Phone 模型类或包含 Phone 属性的 ViewModel 类上实现 IDataErrorInfo?
另外,将我要验证的文本框绑定到我的 ViewModel.NewPhone.StringProperty 的正确方法是什么?
非常感谢
在哪里实现的决定IDataErrorInfo
实际上取决于您的应用程序的逻辑。例如,您可以让您的Phone
类以不允许任何无效电话号码的方式实现它,但在您的视图模型中您希望只允许来自美国的号码。
通常一个好的做法是IDataErrorInfo
在你的模型和视图模型中都实现,如果视图模型没有发现错误,将请求转发给模型。然后你会像往常一样绑定到视图模型。
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];
}
}
我建议让模型实现与每个电话相关的基本验证,例如电话号码格式,并让视图模型实现可能因视图而异的视图特定验证,例如只允许美国电话号码或属于给某个供应商。