在ViewModel中进行所有验证
本文关键字:验证 ViewModel | 更新日期: 2023-09-27 18:00:14
我如何停止UI层执行转换验证,或者至少让它继续?如果我有一个绑定到DateTime:的文本框
// view
<TextBox x:Name="StartTimeTextBox">
<TextBox.Text>
<Binding Path="StartTime"
StringFormat="t"
NotifyOnValidationError="True"
ValidatesOnDataErrors="True"
ValidatesOnExceptions="True" >
<Binding.ValidationRules>
<va:AlwaysSucceedsValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
// view model
[MyValidationAttribute]
public DateTime StartTime {get; set;}
当用户选择文本框中的所有文本并将其删除(或在"asdf"中键入)时,转换失败,它将获得红色边框,验证将停止。我已尝试使用ValidatesOn。。。属性(我认为这将允许我的"MyValidationAttribute
"执行),但没有成功。我还尝试添加一个ValidationRule,无论Text
是什么,它总是返回true,但什么都不起作用。
如果将TextBox.Text
绑定到DateTime
,并且用户在"my hovercraft is full of little lambs"
中键入,那么Binding
可以为您的视图模型属性分配什么以供验证?它无能为力。
您可以将TextBox
的Validation.ErrorTemplate
设置为一个空模板,这样就可以消除红色轮廓业务,但在您的viewmodel属性中仍然无法获得任何可验证的内容。
如果您想将用户的字符串输入验证为有效或无效日期,则必须在您手中有原始字符串输入的某个时刻进行验证。
如果要在视图模型中执行此操作,则意味着为视图模型提供StartTime
的字符串属性,并将其绑定到TextBox
。称之为StringStartTime
;在其setter中,如果字符串有效,则设置DateTime StartTime
;如果无效,它将保留StartTime
,但设置一些错误属性,或抛出异常,或其他什么。