我有一个带MVVM架构的WPF应用程序。视图模型实现IDataErrorInfo,其实现将从嵌套的视图模型中添加错误。 SaveCommand将检查最顶层viewmodel的错误并显示错误MesssageBox如果有任何错误列表中的错误。
适用于业务逻辑检查的错误(如必填字段),但不会处理转换错误,例如用户在绑定到数字属性的TextBox中输入名称。
是否有一个好的方法/库结合了来自ViewModel的错误和UI中指示的但实际上没有到达视图模型的错误?回到viewmodel中的所有字符串属性,这样就可以完成转换,感觉就错了。我想通过逻辑控制树来获取由转换错误引起的所有错误的列表,然后将此列表与INotifyDataInfo errorMessage结合起来但是可能有更好的方法吗?
答案 0 :(得分:0)
您可以使用自定义ValidationRule
并将其与Binding
对象关联,以自定义行为或此验证。有关详细信息,请参阅以下博客文章:https://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/。
<强> XAML:强>
<TextBox>
<TextBox.Text>
<Binding Path="Age" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:StringToIntValidationRule ValidationStep="RawProposedValue"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
...
</TextBox>
<强> C#:强>
public class StringToIntValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
int i;
if (int.TryParse(value.ToString(), out i))
return new ValidationResult(true, null);
return new ValidationResult(false, "Please enter a valid integer value.");
}
}
另请注意,此类验证发生在视图或控件中。视图模型不负责确保视图可以设置视图模型公开的公共属性的值。
它只是暴露了属性,视图的责任是设置它,当然它必须将它设置为正确类型的值。