我有一个模特:
public class Product
{
public int Rating { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
和视图模型:
public class ProductViewModel: IDataErrorProvider
{
public int Temperature { get; set; }
public Product CurrentProduct { get; set; }
public string this[string columnName]
{
get
{
if (columnName == "Rating")
{
if (CurrentProduct.Rating > Temperature)
return "Rating is too high for current temperature";
}
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的视图有一个ProductViewModel实例作为DataContext.该视图具有以下字段:
<TextBox Text={Binding Path=CurrentProduct.Rating, ValidatesOnDataErrors=True} .../>
Run Code Online (Sandbox Code Playgroud)
默认情况下,验证发生在绑定对象(Product)的IDataErrorProvider上,而不是DataContext(ProductViewModel).因此,在上面的实例中,从不调用ProductViewModel验证.这只是一个简单的例子,但说明了问题.该模型不会(也不应该)知道温度,因此设计要求VM应该在该字段上执行验证.
是的,我可以破解它并直接在ViewModel中复制模型的绑定属性,但我认为必须有一种更简单的方法将调用重定向到VM而不是模型?